【发布时间】:2019-11-28 13:11:38
【问题描述】:
对此question 的跟进,data.table 是否可以引用 DT 内的变量来创建新列?
另一个问题想扭转这个局面:
library(data.table)
dt <- data.table(
dates = c("2017-01-01", "2017-01-02", "2017-01-03", "2017-01-04", "2017-01-05"),
yes_no = c(0, 1, 0, 1, 1)
)
dates yes_no
1: 2017-01-01 0
2: 2017-01-02 1
3: 2017-01-03 0
4: 2017-01-04 1
5: 2017-01-05 1
进入这个:
dates yes_no 2017-01-02 2017-01-04 2017-01-05
1: 2017-01-01 0 0 0 0
2: 2017-01-02 1 1 0 0
3: 2017-01-03 0 0 0 0
4: 2017-01-04 1 0 1 0
5: 2017-01-05 1 0 0 1
我想通过引用进行更新,但不知道如何根据 data.table 中的内容创建新列。也就是说,:= 运算符的 LHS 似乎没有在导致此失败的 data.table 环境中查找:
## tried
dt[yes_no == 1, as.character(dates) := as.data.frame(diag(.N))]
eval(lhs, parent.frame(), parent.frame()) 中的错误: 找不到对象“日期”
## used:
ind <- dt[['yes_no']] != 0
cols <- as.character(dt[['dates']])[ind]
dt[, (cols) := 0L]
dt[ind, (cols) := as.data.frame(diag(.N))]
## also valid
# set(d, which(ind), cols, as.data.frame(diag(length(cols))))
有没有更直接的方法来完成这项工作?
dt[yes_no == 1, as.character(dates) := as.data.frame(diag(.N))]
【问题讨论】:
-
这看起来像是一个 xy 问题。我可能会使用
dt[, dt[["dates"]] := as.data.table(diag(.N))]; dt[, dt[yes_no != 1, dates] := NULL],但最终我会避免创建宽格式 data.table。 -
@Roland,我可能永远不会进行这种转换,但实际上,我只是好奇我是否遗漏了什么。你的建议听起来很合理。
标签: r data.table