R语言:如何将字符向量列表存入data.table新列?
解决data.table赋值列表列时的长度不匹配问题
问题根源
你的decompose_string_pairs函数仅能处理单个字符串,当传入data.table的strings列(长度为2的向量)时,函数会把两个字符串的配对结果拼接成一个长度为4的列表(3+1),但data.table只有2行,右侧结果长度与行数不匹配,因此触发报错。
修复方案
方案1:在data.table调用时用lapply逐行处理
直接修改赋值语句,用lapply对strings的每个元素单独调用函数,返回一个与行数一致的列表(每个元素对应该行字符串的配对列表):
library(data.table) library(stringr) # 保留原函数不变 decompose_string_pairs <- function(n_string = ""){ n <- str_count(n_string,"\\|")[[1]] + 1 string_pairs <- list() for(i in n:2){ n1 <- str_split(n_string, "\\|")[[1]][i] for(j in (i-1):1){ n2 <- str_split(n_string,"\\|")[[1]][j] temp_pair <- list(c(n1,n2)) string_pairs <- c(string_pairs,temp_pair) } } return(string_pairs) } dt <- data.table(strings = c("1|2|3","1|4")) # 修正原代码的赋值符号错误 dt[, parsed_list := lapply(strings, decompose_string_pairs)]
验证结果:
> dt strings parsed_list 1: 1|2|3 <list[3]> 2: 1|4 <list[1]> > dt$parsed_list[[1]] [[1]] [1] "3" "2" [[2]] [1] "3" "1" [[3]] [1] "2" "1" > dt$parsed_list[[2]] [[1]] [1] "4" "1"
方案2:修改函数为向量化版本
让函数本身支持向量输入,内部用lapply批量处理每个字符串:
decompose_string_pairs_vec <- function(n_strings){ lapply(n_strings, function(x){ parts <- str_split(x, "\\|")[[1]] n <- length(parts) string_pairs <- list() for(i in n:2){ n1 <- parts[i] for(j in (i-1):1){ n2 <- parts[j] temp_pair <- list(c(n1,n2)) string_pairs <- c(string_pairs,temp_pair) } } string_pairs }) } # 直接调用赋值 dt[, parsed_list := decompose_string_pairs_vec(strings)]
额外优化:避免重复拆分字符串
原函数每次循环都调用str_split,可以提前拆分一次字符串,提升运行效率:
decompose_string_pairs <- function(n_string = ""){ parts <- str_split(n_string, "\\|")[[1]] n <- length(parts) string_pairs <- list() for(i in n:2){ n1 <- parts[i] for(j in (i-1):1){ n2 <- parts[j] temp_pair <- list(c(n1,n2)) string_pairs <- c(string_pairs,temp_pair) } } return(string_pairs) }
内容的提问来源于stack exchange,提问作者BLP92
相关产品推荐
相关产品推荐

