我有一个与下面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
循环来获取包含所有列sp
,sp2
,spn
的相同格式的新数据框?试图适应我在网上看到的各种其他解决方案都以失败告终,因为我自己大脑的某些部分缺失了。感谢。
答案 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
元素将其转换为矩阵。