如何在R data.table的.SD中新增列并保留原有列?
解决data.table中.SD使用:=报错及保留原列问题
看起来你在使用data.table处理分组新增列时遇到了两个核心问题:一是原有列丢失,二是在.SD内使用:=触发锁定报错。咱们一步步拆解解决:
问题根源分析
- 原有列丢失:你的第一段代码在
by = userid的j参数中,只返回了.SD[, .(futurebuddy = ...)]生成的新列,相当于只提取了计算结果,自然会丢掉原表的所有其他列。 - .SD锁定报错:data.table设计中
.SD是分组内的临时数据视图,是只读锁定的,官方明确禁止直接在.SD内使用:=,提示里也说了要直接在j中用:=来实现分组修改。
正确实现方式
你的需求核心是:按userid分组,对每个userid下相同nuggetid的行,将后续同nuggetid行的sessionid作为futurebuddy添加到当前行。其实不需要嵌套.SD,直接按userid + nuggetid分组后使用shift即可,这样既能保留所有原列,又能高效新增目标列:
方式1:直接修改原表(推荐,data.table的引用修改特性)
data[, futurebuddy := shift(sessionid, type = "lead"), by = .(userid, nuggetid)]
方式2:生成包含原列的新表
如果你不想修改原表,而是生成新表保留所有列,可以用copy先复制原表再修改:
test <- copy(data)[, futurebuddy := shift(sessionid, type = "lead"), by = .(userid, nuggetid)]
效果验证
这个写法会在每个userid和nuggetid的分组内,对sessionid执行lead类型的shift——也就是当前行的futurebuddy会是同组下一行的sessionid,最后一行因为没有后续行,futurebuddy会是NA,完全符合你要的"查找后续相同nuggetid的行的sessionid"逻辑。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

