【问题标题】:Turn vector output into columns in data.table along with other columns?将矢量输出与其他列一起转换为 data.table 中的列?
【发布时间】:2013-08-12 11:25:05
【问题描述】:

我的问题与这个有关:

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),但结果相同,但列名不同。

【问题讨论】:

  • 你能提供一个可重现的例子吗?

标签: r data.table


【解决方案1】:

您只需将list 更改为cc 任何类型为list 的值都会自动生成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

【讨论】:

  • 分位数函数为每个函数指定一个名称(例如“0%”、“25%”)。那很好。输出向量但未命名的参数(例如 range())呢?我可以指定名称吗?
【解决方案2】:

试试这个:

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

【讨论】:

  • 这行得通 - 谢谢!有没有办法让我更改列名称?我正在为 X Y 和 Z 做分位数,目前的解决方案给了我重复的列名。
  • @mchangun 只需写上X = as.data.table(... 和一个“X”。将为当前列名添加前缀。
  • @Roland 我稍微修改了你的代码 - 我正在做:featuresDT &lt;- quote(c(list(x = mean(X), y = mean(Y), z = mean(Z)), X = as.list(quantile(X)))) 这两种解决方案有什么性能差异吗?将所有内容都保留为列表似乎更符合 data.tables 的“精神”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
相关资源
最近更新 更多