使用apply(.SD,1,FUN)时data.table输出不一致问题求助
解决data.table合并两列去重报错的问题
核心排查与解决步骤
- 检查数据类型:如果z2的两列类型不一致(比如一列字符、一列因子),合并时极易报错。先用
str(z2)查看列类型,若存在因子列,先转成字符型:z2[, c("col1", "col2") := lapply(.SD, as.character), .SDcols = c("col1", "col2")] - 处理NA值:若原列包含NA,合并去重时可能触发异常。如果业务逻辑允许剔除NA,可在
unique中添加参数:z2[, new_col := unique(c(col1, col2), na.rm=TRUE), by = .I] - 确认逐行操作逻辑:必须加
by = .I保证是逐行合并两列去重,而非对整列所有值去重。正确的逐行处理写法:z2[, new_col := list(unique(c(col1, col2))), by = .I]
可复现的错误与修正示例
比如z2是因子列时会直接报错:
library(data.table) z2 <- data.table(col1 = factor(c("a", "b")), col2 = factor(c("a", "c"))) # 直接运行合并去重代码会报错,因子合并会默认转成整数 # 转字符后再处理即可正常运行 z2[, c("col1", "col2") := lapply(.SD, as.character), .SDcols = c("col1", "col2")] z2[, new_col := list(unique(c(col1, col2))), by = .I]
其他排查方向
- 检查列内异常值:用
table(z2$col1)和table(z2$col2)查看取值分布,确认是否有特殊字符、空字符串等隐性问题。 - 更新data.table版本:老版本可能存在已知bug,执行
update.packages("data.table")更新后重试。
内容的提问来源于stack exchange,提问作者R.Andres Castaneda
相关产品推荐
相关产品推荐

