如何在R中将包含向量的列拆分为多列?
解决方案
针对你提到的混合了向量与单个元素的列表(由str_extract_all生成),可以通过以下两种方式将其拆分为对应最大长度的多列:
方法一:基础R实现
# 你的输入列表 my_list <- list(c("1/3", "2327/1", "2312/3", "2312/7", "2327/3", "2327/2" ), c("10655/1", "5/2024"), c("1690/1", "1693/2", "1688/5", "721/66" ), c("3675/1", "4233/1", "4232/1", "4232/2", "4235/1", "4235/2" ), c("109/9", "109/10"), c("3042/5", "3042/7", "3043/1", "3043/2", "3043/3", "1444/4", "1444/5", "1444/6", "2202/3", "3043/3"), "336/15", "1/3", "1/2", c("1/2", "340/5")) # 步骤1:统一格式,将单个字符串转为长度为1的向量 my_list <- lapply(my_list, function(x) if(is.character(x) && length(x) == 1) c(x) else x) # 步骤2:获取嵌套向量的最大长度 max_col_num <- max(sapply(my_list, length)) # 步骤3:将每个向量填充至最大长度(不足补NA),并组合为数据框 result_df <- as.data.frame(do.call(rbind, lapply(my_list, function(x) { length(x) <- max_col_num x }))) # 给列命名 colnames(result_df) <- paste0("col_", 1:max_col_num)
方法二:tidyverse工具链实现(更简洁)
如果习惯使用tidyverse系列包,可以用以下代码快速处理:
library(tidyverse) result_df <- my_list %>% # 将列表转为带行号的tibble enframe(name = "row_id", value = "matches") %>% # 统一格式:单个元素转为长度1的向量 mutate(matches = map(matches, ~if(is_scalar(.x)) c(.x) else .x)) %>% # 将嵌套的匹配结果拆分为多列 unnest_wider(matches, names_sep = "_")
两种方法最终都会生成一个数据框,列数等于原列表中最长向量的长度,短向量对应的位置会自动填充NA。
内容的提问来源于stack exchange,提问作者Pawels
相关产品推荐
相关产品推荐

