R Data.table创建新列时报错,寻求解决方法
问题描述
作为R语言初学者,运行以下代码时,data.table在创建新列环节抛出错误,推测是语法问题,查阅资料得知添加by参数可能解决,但不知如何添加。
运行代码
NF = MFDETAILED[,c(1,2)] feature_names = colnames(compare) NF = cbind(NF, data.table( NF = apply(compare,1,function(x) {paste0(feature_names[(which(x[]==1))],collapse = ", ")}), NMF = apply(compare,1,function(x) {paste0(feature_names[(which(x[]==0))],collapse = ", ")}) )) # 报错行 **NF[, c("LOOKUP", "MAT") := tstrsplit(COMBINATION, "-", fixed=TRUE)]** NF[, ("COMBINATION"):=NULL] setcolorder(NF, c( "LOOKUP","MAT","MS", "NF","NMF")) setnames(NF,c("LOOKUP MATERIAL", "MATERIAL", "MATCH SCORE","MATCH FEATURES","NON MATCH FEATURES"))
错误信息
Error in
[.data.table(NF, ,:=(c("LOOKUP", "MAT"), tstrsplit(COMBINATION, : Supplied 2 columns to be assigned 4 items. Please see NEWS for v1.12.2.
中文翻译:在[.data.table操作中,提供了2列,但需要分配4个条目。请查看v1.12.2版本的NEWS文档。
问题分析
这个错误的核心原因是:tstrsplit返回的结果总长度和data.table的行数不匹配,导致无法将分割结果正确映射到要创建的2个新列。当部分COMBINATION字段分割后得到的元素数量不一致时,批量处理模式下就会出现条目数不匹配的情况。
解决方法
给data.table的操作添加by = .I参数,强制按行索引逐行处理分割逻辑,确保每行的分割结果都能正确对应到该行的LOOKUP和MAT列。修改后的报错行代码如下:
NF[, c("LOOKUP", "MAT") := tstrsplit(COMBINATION, "-", fixed=TRUE), by = .I]
完整修改后代码
NF = MFDETAILED[,c(1,2)] feature_names = colnames(compare) NF = cbind(NF, data.table( NF = apply(compare,1,function(x) {paste0(feature_names[(which(x[]==1))],collapse = ", ")}), NMF = apply(compare,1,function(x) {paste0(feature_names[(which(x[]==0))],collapse = ", ")}) )) # 修改后的行 NF[, c("LOOKUP", "MAT") := tstrsplit(COMBINATION, "-", fixed=TRUE), by = .I] NF[, ("COMBINATION"):=NULL] setcolorder(NF, c( "LOOKUP","MAT","MS", "NF","NMF")) setnames(NF,c("LOOKUP MATERIAL", "MATERIAL", "MATCH SCORE","MATCH FEATURES","NON MATCH FEATURES"))
原理说明
by = .I会让data.table以每行作为一个分组来执行操作,tstrsplit会单独处理每行的COMBINATION值,分割后的结果直接分配到当前行的两个新列中,避免了批量处理时因条目数不匹配导致的报错。
内容的提问来源于stack exchange,提问作者Arvind Menon
相关产品推荐
相关产品推荐

