对此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))]
答案 0 :(得分:3)
不漂亮,但您可以这样做:
dt[yes_no == 1,
(dt[yes_no == 1, as.character(dates)]) := as.data.table(diag(.N))]