汇总多行的行

时间:2016-07-24 03:20:33

标签: r aggregate

我有一个与下面d相同格式的大型数据框,其中三列的计数数据嵌套在两个不同的因子中。

elevation   distance    sp1 sp2 spn
1500    0   2   2   5
1500    0   2   1   5
1500    50  2   2   5
1500    50  2   2   6
2000    0   9   2   5
2000    0   7   2   2
2000    50  4   3   6
2000    50  4   3   4

请注意,每个因子d$distance都有两个重复行。

我想通过每列中的求和来聚合每个高程内每个距离级别的复制行,所以它最终会像这样:

elevation   distance    sp1 sp2 spn
1500    0   4   3   10
1500    50  4   4   11
2000    0   16  4   7
2000    50  8   6   10

我可以轻松地对一列进行操作,例如sp1 d2 <-data.frame(aggregate(sp1 ~ elevation + distance, data = d, sum))

我是否可以避免使用for循环来获取包含所有列spsp2spn的相同格式的新数据框?试图适应我在网上看到的各种其他解决方案都以失败告终,因为我自己大脑的某些部分缺失了。感谢。

1 个答案:

答案 0 :(得分:2)

我们可以使用summarise_each中的dplyr。这将是快速和有效的。

library(dplyr)
df1 %>%
   group_by(elevation, distance) %>% 
   summarise_each(funs(sum))
#  elevation distance   sp1   sp2   spn
#      <int>    <int> <int> <int> <int>
#1      1500        0     4     3    10
#2      1500       50     4     4    11
#3      2000        0    16     4     7
#4      2000       50     8     6    10

或另一个选项是data.table

library(data.table)
setDT(df1)[, lapply(.SD, sum) , by = .(elevation, distance)]

使用base R aggregate方法将使用.来指定除~的rhs中指定的列以外的所有列。但是,在大型数据集上,这将是缓慢的。

aggregate(.~elevation+distance, df1, sum)
#   elevation distance sp1 sp2 spn
#1      1500        0   4   3  10
#2      2000        0  16   4   7
#3      1500       50   4   4  11
#4      2000       50   8   6  10

注意:如果有NA值,请使用na.rm = TRUE中的sum

正如@ user2100721建议的那样,我们也可以使用by中的base R

by(df1[3:5], df1[1:2], FUN = colSums)

输出为list,可以通过rbind list元素将其转换为矩阵。