R语言中合并首元素相同的列表子项的实现方法
问题根因
你的代码输出不符合预期有两个核心原因:
- 调用
rbind.data.frame时默认开启了字符串转因子规则,v1列实际存储的是因子对应的整数索引而非原始字符串,强制转字符时会得到索引值1/2/3/4,而非预期的12/13/22/30 - 对tibble行子集直接调用
as.character会优先读取因子的底层存储值,无法得到原始文本内容
修正实现方案
方案1:基于你原有dplyr逻辑修改
library(dplyr) # 原始列表 v <- list(c("12", "1"), c("12", "2"), c("12", "3"), c("13", "1"), c("22", "3"), c("30", "4")) # 构造数据框时禁用字符串转因子 vv <- do.call(rbind.data.frame, c(v, stringsAsFactors = FALSE)) names(vv) <- c("v1", "v2") # 分组拼接第二个元素 vvv <- vv %>% group_by(v1) %>% summarise(v3 = paste0(v2, collapse = ",")) # 按行构造目标列表 w <- lapply(1:nrow(vvv), function(i) c(vvv$v1[i], vvv$v3[i]))
输出验证:
> w [[1]] [1] "12" "1,2,3" [[2]] [1] "13" "1" [[3]] [1] "22" "3" [[4]] [1] "30" "4"
方案2:基础R无依赖实现(更简洁)
不需要加载dplyr等额外包,直接用基础函数完成:
v <- list(c("12", "1"), c("12", "2"), c("12", "3"), c("13", "1"), c("22", "3"), c("30", "4")) # 按子项首元素分组 grouped <- split(sapply(v, `[`, 2), sapply(v, `[`, 1)) # 拼接第二个元素后转换为目标列表格式 w <- lapply(names(grouped), function(k) c(k, paste(grouped[[k]], collapse = ",")))
内容的提问来源于stack exchange,提问作者esti
相关产品推荐
相关产品推荐

