我挣扎与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)
感觉我在这里缺少一些基本的东西.
所提到的常见问题只是出在如何修改解决方法(的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)