1

我想使用 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

它不如弗兰克的效率高,但这是我最初要求的,即用评论重写行。

4

2 回答 2

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. 您还可以通过[]在调用结束时附加或将整个内容放在括号中来打印它。

于 2013-05-31T15:56:26.713 回答
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
于 2013-05-31T15:39:41.130 回答