【问题标题】:data.table assign new columns based on variabledata.table 根据变量分配新列
【发布时间】: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


【解决方案1】:

不漂亮,但你可以:

dt[yes_no == 1, 
   (dt[yes_no == 1, as.character(dates)]) := as.data.table(diag(.N))]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 2022-11-19
    相关资源
    最近更新 更多