【问题标题】:Persistent assignment in data.table with .SD带有 .SD 的 data.table 中的持久分配
【发布时间】:2015-04-29 23:06:50
【问题描述】:

我在 data.table 中的 .SD 调用中苦苦挣扎

特别是,我试图识别一组数据中的一些逻辑特征,并在另一个变量中绘制一些识别标记。 .SD 的规范应用,对吧?

从 FAQ 4.5,http://cran.r-project.org/web/packages/data.table/vignettes/datatable-faq.pdf,想象下表:

library(data.table) # 1.9.5

DT = data.table(a=rep(1:3,1:3),b=1:6,c=7:12)
DT[,{ mySD = copy(.SD)
      mySD[1, b := 99L]
      mySD },
    by = a]
##   a  b  c
## 1: 1 99  7
## 2: 2 99  8
## 3: 2  3  9
## 4: 3 99 10
## 5: 3  5 11
## 6: 3  6 12

我已将这些值分配给 b(使用 ':=' 运算符),因此当我重新调用 DT 时,我希望得到相同的输出。但是,出乎意料的是,我遇到了原始表:

DT
##    a b  c
## 1: 1 1  7
## 2: 2 2  8
## 3: 2 3  9
## 4: 3 4 10
## 5: 3 5 11
## 6: 3 6 12

预期的输出是原始帧,在“b”中进行了持续修改:

DT
##   a  b  c
## 1: 1 99  7
## 2: 2 99  8
## 3: 2  3  9
## 4: 3 99 10
## 5: 3  5 11
## 6: 3  6 12

当然,我可以将此表复制到另一个表中,但这似乎与精神不符。

DT2 <- copy(DT[,{ mySD = copy(.SD)
                  mySD[1, b := 99L]
                  mySD },
               by = a])
DT2
##   a  b  c
## 1: 1 99  7
## 2: 2 99  8
## 3: 2  3  9
## 4: 3 99 10
## 5: 3  5 11
## 6: 3  6 12

感觉我在这里遗漏了一些基本的东西。

【问题讨论】:

  • 如果你还没有,我建议你去看看 Reference Semantics vignette here

标签: r data.table


【解决方案1】:

上述常见问题解答只是显示了如何修改(临时副本).SD 的解决方法,但它不会更新您的原始数据就地。解决您问题的可能方法是

DT[DT[, .I[1L], by = a]$V1, b := 99L]
DT
#    a  b  c
# 1: 1 99  7
# 2: 2 99  8
# 3: 2  3  9
# 4: 3 99 10
# 5: 3  5 11
# 6: 3  6 12

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-10
    • 2015-06-16
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 2012-04-08
    • 2018-05-12
    • 1970-01-01
    相关资源
    最近更新 更多