2014-12-03 62 views
2

这是我在StackOverflow上的第一个问题。我将尽我所能使它简明扼要,如果不是,我很抱歉。我也是R的新手。我在StackOverflow上浏览了一下我的问题的答案。我发现了一些有用的东西,但我不确定哪些方法最适合使用,或者如何将它们组合在一起以使其工作。基于另一列中的行子集取得多个列的最大值

我有一个这样的数据集,名为“PER1”

Day Stat1 Stat2 Stat3 
    10 2.12 1.84 2.11 
    10 2.09 1.87 2.07 
    10 2.08 1.92 2.07 
    11 1.90 1.85 1.88 
    11 1.87 1.85 1.93 
    11 1.86 1.87 1.93 

我想要做的就是找到数据的每一天每一个“统计”一栏的最大值是什么。换句话说,每列中计算最大值的行是在“日”列中包含相同值的行。输出将如下所示:

Day MaxStat1 MaxStat2 MaxStat3 
10 2.12  1.92  2.11 
11 1.87  1.87  1.93 

我想打一个循环,定义了在日列中唯一值的数量,然后使用该定义的最大将从每列来计算的行。但我坚持如何根据独特的日子将最大函数获取到每列中的子集行。我至今很粗糙,我甚至不能确定它遵循正确的[R规则(再次,新R)

days <- unique(per1$Day) 
stations <- per1[,1:3] 
l <- length(days) 
for (k in 1:l) { 
curr_day <- subset(per1, per1$Day == days[k]) ##this defines the individual day 
curr_stn <- stations[curr_day,] ##this is supposed to define the number of rows as the number of rows in curr_day 
for(i in 1:stations) { ##loop over each column 
max[i] <- max(stations[curr_day,curr_stn]) ##take the maximum for each column based on the number of rows for each curr_day 
} 
} 

我也得到

Error in stations[curr_day, ] : subscript out of bounds 

所以我想这意味着我的天堂没有正确定义我的论点。如果任何人可以帮助我与这个循环适当的格式,这将非常感激!任何其他更清洁/更快的方法也将受到欢迎。 (我看着“mapply”,但无法弄清楚如何编写定义Stat列的行数的函数作为每个独特Day的行数)

谢谢你的时间。

回答

2

这是一个简单的分组计算。困难的部分已经为我们完成了。我们可以使用aggregate

aggregate(. ~ Day, per1, max) 
# Day Stat1 Stat2 Stat3 
# 1 10 2.12 1.92 2.11 
# 2 11 1.90 1.87 1.93 
+0

我喜欢这是一个内置的R命令,而不必进入不同的包。你介意解释一下“”。和“〜”是为了什么?我假设他们以某种方式表明了论点? – abishop 2014-12-04 12:59:52

+0

我想到“。”表示整个数据帧,但我不熟悉“〜”作为元字符。 – abishop 2014-12-04 13:05:46

1

R的最好的部分是不必做循环!试试这个:

library(dplyr) 
maxdat <- per1 %>% 
      group_by(Day) %>% 
      summarise_each(funs(max)) 
+0

工作正常,谢谢!你介意解释%>%运算符吗?我假设group_by,summarise_each和funs函数是dplyr包的一部分? – abishop 2014-12-04 12:49:02

+1

@abishop它被称为“管道”,虽然它在dplyr包中,但它来自它自己的名为'magrittr'的包。它将一个函数的结果传递给下一个函数,允许您将函数链接在一起,而无需将每个步骤保存在变量中,或者在函数中包含函数。这个很酷。 – Nick 2014-12-04 18:07:43

0

更新使用dplyr尼克的回答是:

summarise_each()已被弃用,由summarise_all()取代。相关dplyr发行说明,https://github.com/tidyverse/dplyr/releases/tag/v0.7.0

per1 <- data.frame(Day = c(10, 10, 10, 11, 11, 11), 
        stat1 = rnorm(6), 
        stat2 = runif(6), 
        stat3 = 1:6) 

per1 
## Day  stat1  stat2 stat3 
## 1 10 0.5172806 0.14336084  1 
## 2 10 -0.5693747 0.10477538  2 
## 3 10 -0.3351060 0.77701780  3 
## 4 11 -0.1472232 0.28173915  4 
## 5 11 0.5093479 0.65901061  5 
## 6 11 -1.8770271 0.02960309  6 

library(dplyr) 
maxdat <- per1 %>% 
      group_by(Day) %>% 
      summarise_all(max) 

maxdat 
## # A tibble: 2 x 4 
##  Day stat1 stat2 stat3 
## <dbl> <dbl> <dbl> <dbl> 
## 1 10.0 0.517 0.777 3.00 
## 2 11.0 0.509 0.659 6.00 
相关问题