我想使用data.table来计算指定的每个组的变量。为简单起见,假设数据按照x1:
中的组进行拆分x1 x2
a 3
a 4
b 1
b 5
我想为每个组的平均值创建一个变量,但我不知道如何索引每个组:
DT[,list(
mean_a=mean(x2) #for all rows containing "a"
mean_b=mean(x2) #for all rows containing "b"
by="x1")]
如何用评论重写这些行? (即找到所有行的平均值为“a”,相同的“b”)
我需要在单独的列中将输出作为data.table,因为它将进一步处理:
mean_a mean_b
3.5 3
编辑:玩完之后,这就是我想要的解决方案。
> DT2=DT[,list(
+ mean_a=mean(x[grep("a",x1),x2]),
+ mean_b=mean(x[grep("b",x1),x2])),
+ by=NULL]
>
> DT2
mean_a mean_b
1: 3.5 3
它不像弗兰克那样高效,但它是我原来要求的,即用评论重写这些行。
答案 0 :(得分:4)
我不认为为x1
的每个值单独设置名称是值得的,只需选择合适的前缀:
dt[,mean(x2),by=x1][,{
names(V1) <- paste("mean_",x1,sep="")
do.call(data.table,as.list(V1))
}]
但是,如果您真的想要自定义名称,可以事先将它们放入向量中:
mynames <- c(
a = "mean_a",
b = "mean_b"
)
dt[,mean(x2),by=x1][,{
names(V1) <- mynames[x1]
do.call(data.table,as.list(V1))
}]
结果是
mean_a mean_b
1: 3.5 3
编辑:正如@eddi所指出的,这是做同样事情的更好方法:
setnames(dt[,mean(x2),keyby=x1][, as.list(V1)], sort(mynames))
如果您将其分配到某个地方,您会看到它是所需的data.table
。您还可以通过在通话结束时附加[]
或将整个内容放在括号中来打印。
答案 1 :(得分:0)
我相当确定有一个更优雅的解决方案,但这有效:
x1 <- c('a','a','b','b')
x2 <- c(3,4,1,5)
df=data.frame(as.factor(x1),x2)
groupmeans = sapply(unique(x1), function(x) {mean(df[x1==x,]$x2)})
# a b
# 3.5 3.0
groupmeans_table = data.table(t(groupmeans))
# a b
# 1: 3.5 3