You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含分隔符的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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:54:26