2013-08-12 27 views
4

我的问题是有关这一个:将矢量输出与其他列一起转换为data.table中的列?

Turn vector output into columns in data.table?

但我的情况有点复杂。我不仅将列向量作为列返回,而且还将同时计算其他列。例如:

DT = data.table(X = 1:10, Y = 11:20, Z = 21:30, group = rep(1:10, each = 3)) 

featuresDT <- quote(list(x = mean(X), 
         y = mean(Y), 
         z = mean(Z), 
         as.list(quantile(X)))) 

DT[, eval(featuresDT), by = "group"] 

其中quantile返回长度为5的矢量。而不是得到一个8列data.table,我得到一个4列和quantile结果显示为额外的行和x, y and z重复5次。我也试过dist = as.list(quantile(X),但是给出了相同的结果,但列名不同。

+1

可以请你提供一个可重复的例子吗? – statquant

+0

@statquant done – mchangun

回答

3

你应该只改变listcclist类型的任何值会自动导致list):

featuresDT <- quote(c(x = mean(X), 
         y = mean(Y), 
         z = mean(Z), 
         as.list(quantile(X)))) 
DT[, eval(featuresDT), by = "group"] 

    group  x  y  z 0% 25% 50% 75% 100% 
1:  1 2.000000 12.00000 22.00000 1 1.5 2 2.5 3 
2:  2 5.000000 15.00000 25.00000 4 4.5 5 5.5 6 
3:  3 8.000000 18.00000 28.00000 7 7.5 8 8.5 9 
4:  4 4.333333 14.33333 24.33333 1 1.5 2 6.0 10 
5:  5 4.000000 14.00000 24.00000 3 3.5 4 4.5 5 
6:  6 7.000000 17.00000 27.00000 6 6.5 7 7.5 8 
7:  7 6.666667 16.66667 26.66667 1 5.0 9 9.5 10 
8:  8 3.000000 13.00000 23.00000 2 2.5 3 3.5 4 
9:  9 6.000000 16.00000 26.00000 5 5.5 6 6.5 7 
10: 10 9.000000 19.00000 29.00000 8 8.5 9 9.5 10 
1

试试这个:

featuresDT <- quote(cbind(list(x = mean(X), 
         y = mean(Y), 
         z = mean(Z)), 
         as.data.table(t(quantile(X))))) 
+0

工作原理 - 谢谢!有没有办法让我改变列名?我正在为X Y和Z做分位数,现在的解决方案给了我重复的列名称。 – mchangun

+1

@mchangun只需编写'X = as.data.table(...'和一个“X.”就可以作为当前列名的前缀 – Frank

+0

@Frank - 修正了它,谢谢 – mchangun