合并data.table后使用:=赋值新列触发Invalid .internal.selfref错误求助
解决data.table合并后使用
:=赋值的内部引用错误 错误原因
当你用dplyr::left_join合并两个data.table时,返回的对象虽表面是data.table类型,但dplyr的操作已破坏了它的内部引用结构(.internal.selfref),导致data.table无法直接通过引用(:=)添加列,因此触发该提示(系统会自动做浅拷贝修复,但会额外消耗资源)。
解决方案
方案1:使用data.table原生合并函数
改用data.table内置的合并方法,确保生成的对象结构完整,支持直接引用赋值:
table1 <- data.table::data.table(A=c(1,2,3,4,5), B=c(1,2,3,4,5)) table2 <- data.table::data.table(C=c(5,4,3,2,1), B=c(1,1,1,2,2)) # 方法1:用merge实现左连接 table_merge <- merge(table1, table2, by = "B", all.x = TRUE) table_merge[, new_col := "something"] # 方法2:用data.table连接语法实现左连接 table_merge <- table2[table1, on = .(B), nomatch = NA] table_merge[, new_col := "something"]
方案2:修复dplyr合并后的data.table结构
若必须使用dplyr的left_join,可通过setDT()重新整理对象内部结构,再进行引用赋值:
table1 <- data.table::data.table(A=c(1,2,3,4,5), B=c(1,2,3,4,5)) table2 <- data.table::data.table(C=c(5,4,3,2,1), B=c(1,1,1,2,2)) table_merge <- dplyr::left_join(table1, table2, by=dplyr::join_by(B)) # 修复内部引用结构 data.table::setDT(table_merge) # 正常使用:=赋值 table_merge[, new_col := "something"]
方案3:直接用dplyr添加列
若不需要data.table的引用赋值特性,可直接用dplyr的mutate完成列添加:
table_merge <- dplyr::left_join(table1, table2, by=dplyr::join_by(B)) %>% dplyr::mutate(new_col = "something")
内容的提问来源于stack exchange,提问作者ReelSaemon
相关产品推荐
相关产品推荐

