R 如何用data.table替换聚合?

R 如何用data.table替换聚合?,r,data.table,aggregate,R,Data.table,Aggregate,我得到了以下数据: > dput(bla) structure(list(V1 = structure(c(4L, 4L, 4L, 2L), .Label = c("DDDD", "EEEE", "NNNN", "PPPP", "ZZZZ"), class = "factor"), V2 = c(100014096L, 100014098L, 100014099L, 100014995L), V3 = c(0.742, 0.779, 0.744, 0.42), V4 = c(1.07

我得到了以下数据:

> dput(bla)
structure(list(V1 = structure(c(4L, 4L, 4L, 2L), .Label = c("DDDD", 
"EEEE", "NNNN", "PPPP", "ZZZZ"), class = "factor"), V2 = c(100014096L, 
100014098L, 100014099L, 100014995L), V3 = c(0.742, 0.779, 0.744, 
0.42), V4 = c(1.077, 1.054, 1.049, 0.984), V5 = c(0.662, 0.663, 
0.671, 0.487), V6 = c(1.107, 1.14, 1.11, 0.849), V7 = c(0.456, 
0.459, 0.459, 1.278)), .Names = c("V1", "V2", "V3", "V4", "V5", 
"V6", "V7"), class = "data.frame", row.names = c(NA, 4L))

> bla
    V1        V2    V3    V4    V5    V6    V7
1 PPPP 100014096 0.742 1.077 0.662 1.107 0.456
2 PPPP 100014098 0.779 1.054 0.663 1.140 0.459
3 PPPP 100014099 0.744 1.049 0.671 1.110 0.459
4 EEEE 100014995 0.420 0.984 0.487 0.849 1.278
我想执行一个函数来实现以下功能,目前我正在使用
aggregate

> linem<- aggregate(bla[,3:7], list(line=bla$V1),mean, na.rm=T) 
> linem
  line    V3    V4        V5    V6    V7
1 EEEE 0.420 0.984 0.4870000 0.849 1.278
2 PPPP 0.755 1.060 0.6653333 1.119 0.458
>linem-linem
生产线V3 V5 V7
1 EEEE 0.420 0.984 0.4870000 0.849 1.278
2 PPPP 0.755 1.060 0.6653333 1.119 0.458
为了提高这个脚本的性能,我一直在尝试掌握data.table来实现这一点如何使用data.table获得上述输出?

我一直在尝试使用data.table,但是如果有像这样更快的方法,它也会很好。

我们将'data.frame'转换为'data.table'(
setDT(bla)
),按'V1'分组,指定
.SDcols
中的列,在列上循环(
lappy(.SD,
)并获得
平均值

 library(data.table)
 setDT(bla)[, lapply(.SD, mean), by = V1, .SDcols= 3:ncol(bla)]
 #     V1    V3    V4        V5    V6    V7
 #1: PPPP 0.755 1.060 0.6653333 1.119 0.458
 #2: EEEE 0.420 0.984 0.4870000 0.849 1.278
lappy
colMeans
.SD
上的“矢量化”选项:

library(data.table)

setDT(bla)[,as.list(colMeans(.SD[ , 2:6])), V1]
#     V1    V3    V4        V5    V6    V7
#1: PPPP 0.755 1.060 0.6653333 1.119 0.458
#2: EEEE 0.420 0.984 0.4870000 0.849 1.278

“你可以在12分钟内接受答案。”你太快了。谢谢!虽然提供的两种解决方案都非常快,但akrun的性能优于colonelbeauvel,速度大约是colonelbeauvel的两倍。很好。你也可以这样做:
.SDcols=V3:V7
with=FALSE
返回深度副本。并且
colMeans()
将其转换为矩阵(另一个深度复制)…所以这个解决方案最终应该慢得多…我不知道正在进行深度复制,这是有用的!不用担心…行和列统计(至少是最常见的)应该在下一个版本中有更好的支持。。。