一个简单的例子
a <- c(1,1,2)
b <- c(1000,200,20)
c <- c(10,20,10)
myframe <- data.frame(a,b,c)
> myframe
a b c
1 1 1000 10
2 1 200 20
3 2 20 10
我现在想要聚合列c的值,其中列a的值等于1
。结果应该是30
。
对原始数据说一句,数据框有大约100,000行和400列。要聚合的值行在数据中弹出大约10-30次。
答案 0 :(得分:4)
汇总c
a == 1
。
with(myframe, sum(c[a == 1]))
# [1] 30
答案 1 :(得分:1)
如果你有一个非常大的数据集,可以使用data.table
binary search(虽然看起来@Svens解决方案将足够有效)
library(data.table)
setkey(setDT(myframe), a)[J(1), sum(c)]
# [1] 30
为了说明差异,可以证明对于1MM行的数据集,二进制搜索速度提高了6倍
set.seed(123)
n <- 1e6
a <- sample(1e3, n, replace = TRUE)
b <- sample(1e4, n, replace = TRUE)
c <- sample(1e2, n, replace = TRUE)
myframe <- data.frame(a,b,c)
myframe2 <- copy(myframe)
library(microbenchmark)
microbenchmark(Sven = with(myframe, sum(c[a == 1])),
David = setkey(setDT(myframe2), a)[J(1), sum(c)])
# Unit: milliseconds
# expr min lq mean median uq max neval
# Sven 28.020912 30.171903 32.858967 31.464116 32.766395 71.02099 100
# David 3.696436 4.080331 5.719189 4.469356 6.167174 43.38575 100
答案 2 :(得分:0)
'aggregate'函数:
> aggregate(c~a, data=myframe, sum)
a c
1 1 30
2 2 10
data.table版本:
> library(data.table)
> setDT(myframe)[,list(sum=sum(c)),by=a]
a sum
1: 1 30
2: 2 10