使用.SD在data.table中持久分配

ale*_*lex 3 r data.table

挣扎与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
Run Code Online (Sandbox Code Playgroud)

我已将这些值分配给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
Run Code Online (Sandbox Code Playgroud)

预期输出是原始框架,在'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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

感觉我在这里缺少一些基本的东西.

Dav*_*urg 6

所提到的常见问题只是出在如何修改解决方法(的temprory复印件).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
Run Code Online (Sandbox Code Playgroud)