聚合列值的有效方法是值是特定值

时间:2014-10-24 13:56:04

标签: r dataframe aggregate

一个简单的例子

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次。

3 个答案:

答案 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