为data.table中指定的每个组创建变量

时间:2013-05-31 08:48:16

标签: r data.table

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

它不像弗兰克那样高效,但它是我原来要求的,即用评论重写这些行。

2 个答案:

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