【问题标题】:Create column names based on "by" argument the data.table way根据 data.table 方式的“by”参数创建列名
【发布时间】:2015-10-12 07:08:06
【问题描述】:

假设我有以下data.table

dt <- data.table(var = c("a", "b"), val = c(1, 2))

现在我想向dt 添加两个新列,分别命名为ab,其值分别为(1、2)。我可以用循环来做到这一点,但我想用 data.table 的方式来做。

结果将是这样的data.table

dt.res <- data.table(var = c("a", "b"), val = c(1, 2), #old vars 
                     a = c(1, NA), b = c(NA, 2)) # newly created vars

到目前为止,我想出了类似的东西

dt[, c(xx) := val, by = var]

其中xx 将是一个类似于.Ndata.table-command,它处理by-group 的值。

感谢您的帮助!

附录:for循环方式

带有 for-loop 而不是 by-argument 的 non-data.table-way 看起来像这样:

for (varname in dt$var){
     dt[var == varname, c(varname) := val]
}

【问题讨论】:

  • 试试dt[, c('a', 'b') := Map('*', lapply(var, function(x) val[NA^(x!=var)]), val)]
  • 看大图会很高兴。你真正想做什么?
  • 我正在尝试编写一个获取金融交易日期的函数,并根据这些信息构建投资组合。问题涉及计算投资组合中持有的股票数量的函数的一部分。例如,股票“a”的数量为 1,股票“b”的数量为 2。接下来的步骤是将 data.table 与另一个合并,包含价格并将值相乘以获得投资组合值.这有什么帮助吗?
  • dt[, ':='(var1=val1, var2=val2...) ] 有什么问题?您需要以编程方式生成或传递名称吗?
  • 我不明白 "xx 将是一个类似于 .N 的 data.table-command,用于处理按组的值"。能给我举个例子吗?您想根据 by-argument 中的名称形成 xx 中的变量名称向量吗?请举个例子。

标签: r data.table


【解决方案1】:

根据示例,我们可以使用data.table 中的dcast 将长格式转换为宽格式,并与原始数据集on 'val' 列连接。

library(data.table)#v1.9.6+
dt[dcast(dt, val~var, value.var='val'), on='val']
#   var val  a  b
#1:   a   1  1 NA
#2:   b   2 NA  2

或者如cmets中提到的@CathG,对于以前的版本,要么merge要么设置键列然后加入。

merge(dt, dcast.data.table(dt, val~var, value.var='val'))

【讨论】:

  • library(reshape2); merge(dt, dcast(dt, val~var, value.var='val')) 使用旧版本的 data.table
  • ...如果这是答案,那么问题需要重述。更改为宽格式和合并/加入/dcast 是问题的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 1970-01-01
  • 2020-07-16
  • 1970-01-01
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多