如果我有以下简单数据表:
DT <- data.table(VAL = sample(c(1, 2, 3), 10, replace = TRUE),Group = c(rep("A",5),rep("B",5)))
我可以通过以下方式计算平均值:
DT[,lapply(.SD,function(x){mean(x)}),by=Group]
我也可以使用:
DT[,lapply(.SD,function(x){sum(x)/.N}),by=Group]
但我的问题是,为什么以下不起作用:
DT[,lapply(.SD,function(x){sum(x)/nrow(x)}),by=Group]
根据我的理解,.SD是完整数据表的子数据表,所以通过函数(x)我应该能够引用x的行数 - 换句话说,为什么我可以计算sum(x) ),但不是.SD中的nrow(x)?在这方面的文档中没有找到任何内容。
答案 0 :(得分:4)
.SD
是data.table
,但是当您lapply
时,每个x
值都是列向量,nrow
1}}不起作用。如果你改为length
,它会返回行数。
DT[,lapply(.SD,function(x){sum(x)/length(x)}),by=Group]
# Group VAL
# 1: A 2.0
# 2: B 1.6