【问题标题】:R data.table - How to modify by reference when using .SD?R data.table - 使用.SD时如何通过引用进行修改?
【发布时间】:2021-05-03 18:18:26
【问题描述】:

所以我是 data.table 的新手,现在不明白我可以在使用 .SD 符号对所选列执行操作的同时通过引用进行修改?我有两个例子。

示例 1

> DT <- data.table("group1:1" = 1, "group1:2" = 1, "group2:1" = 1)
> DT
   group1:1 group1:2 group2:1
1:        1        1        1

例如,假设我只选择名称中包含“group1:”的列。我知道将操作结果重新分配给同一个对象非常简单,如下所示:

cols1 <- names(DT)[grep("group1:", names(DT))]
DT <- DT[, .SD, .SDcols = cols1]

通过阅读关于引用语义的data.table 小插图,我的理解是上述内容不会通过引用进行修改,而使用:= 的类似操作会这样做。这是准确的吗?如果这是正确的,有没有更好的方法来执行这个通过引用修改的操作?在试图弄清楚这一点时,我陷入了如何组合 .SD 符号和 := 运算符的问题上。我试过了

DT[, c(cols1) := .SD, .SDcols = cols1]
DT[, c(cols1) := lapply(.SD,function(x)x), .SDcols = cols1]

两者都没有给出我想要的结果。

示例 2

假设我想执行一个不同的操作dcast,它使用.SD 作为输入。示例数据表:

> DT <- data.table(x = c(1,2,1,2), y = c("A","A","B","B"), z = 5:8)
> DT
   x y z
1: 1 A 5
2: 2 A 6
3: 1 B 7
4: 2 B 8

再一次,我知道我可以像这样重新分配:

> DT <- dcast(DT, x ~ y, value.var = "z")
> DT
   x A B
1: 1 5 7
2: 2 6 8

但不明白为什么以下方法不起作用(或者在某些情况下是否更可取):

> DT <- data.table(x = c(1,2,1,2), y = c("A","A","B","B"), z = 5:8)
> cols <- c("x", unique(DT$y))
> DT[, cols := dcast(.SD, x ~ y, value.var = "z")]

【问题讨论】:

    标签: r reference data.table dcast


    【解决方案1】:

    在你的例子中,

    cols1 <- names(DT)[grep("group1:", names(DT))]
    DT[, c(cols1) := .SD, .SDcols = cols1] # not this
    
    DT[, (cols1) := .SD, .SDcols = cols1] # this will work
    

    以下是通过引用在数字列.SDcols 上设置 0 值的另一个示例。

    诀窍是在:= 之前分配列名向量。

    colnames = DT[, names(.SD), .SDcols = is.numeric] # column name vector
    DT[, (colnames) := lapply(.SD, nafill, fill = 0), .SDcols= is.numeric]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-23
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多