如何将含分隔符的DataFrame拆分为多行并按需填充NA?
问题描述
我有如下DataFrame:
A B C D E F G 1/2 3/4 4/5/6 7/8 9/10 11 12/13/14/15
希望将其拆分为如下形式:
A B C D E F G 1 3 4 7 9 11 12 2 4 5 8 10 NA 13 NA NA 6 NA NA NA 14 NA NA NA NA NA NA 15
请问是否有简洁的实现方式?
我曾考虑将每列拆分为列表,例如使用:
list_of_dfs
并对每个df执行:
modified_dfs %>% separate_rows(colnames(each_df), sep = "/")
随后合并所有处理后的DataFrame:
merge(modified_dfs)
简洁实现方案
方案一:Tidyverse 工具链实现
利用tidyverse的函数组合,一步完成列拆分、行扩展和格式重塑:
library(tidyverse) # 构造示例数据 df <- tibble( A = "1/2", B = "3/4", C = "4/5/6", D = "7/8", E = "9/10", F = "11", G = "12/13/14/15" ) df %>% # 转为长格式 pivot_longer(everything(), names_to = "col", values_to = "val") %>% # 按分隔符拆分扩展行 separate_rows(val, sep = "/") %>% # 按列分组,标记行号 group_by(col) %>% mutate(row_id = row_number()) %>% # 转回宽格式 pivot_wider(names_from = col, values_from = val) %>% # 移除行号列,空值替换为NA select(-row_id) %>% mutate(across(everything(), ~na_if(.x, "")))
方案二:Base R 原生实现
无需加载第三方包,通过基础函数处理每列的拆分与填充:
# 构造示例数据 df <- data.frame( A = "1/2", B = "3/4", C = "4/5/6", D = "7/8", E = "9/10", F = "11", G = "12/13/14/15", stringsAsFactors = FALSE ) # 拆分每列得到字符向量列表 split_cols <- lapply(df, function(x) strsplit(x, "/")[[1]]) # 确定需要生成的最大行数 max_rows <- max(sapply(split_cols, length)) # 对每个列向量填充NA至最大行数,组合为结果DataFrame result_df <- as.data.frame(lapply(split_cols, function(x) c(x, rep(NA, max_rows - length(x)))))
两种方案都能高效得到目标格式,避免了拆分多个DataFrame再合并的繁琐步骤。
内容的提问来源于stack exchange,提问作者Gabriel G.
相关产品推荐
相关产品推荐

