R语言:将DataFrame中含"+"的字段拆分并生成新行
解决R中多列数据按分隔符拆分并对齐行的问题
可以使用tidyverse工具包实现需求,核心思路是将每列中用+分隔的内容拆分为单独元素,再将各列补空对齐到最长列的长度,最终合并为新的DataFrame。
步骤1:加载工具包并定义原始数据
library(tidyverse) # 原始数据 df <- data.frame( G1 = c("GH13_22+CBM4", "GH109+PL7+GH9", "GT57", "AA3", "", ""), G2 = c("GH13_22", "", "GT57+GH15", "AA3", "GT41", "PL+PL2"), G3 = c("GH13", "GH1O9", "", "CBM34+GH13+CBM48", "GT41", "GH16+CBM4+CBM54+CBM32"), stringsAsFactors = FALSE )
步骤2:定义拆分补空函数
该函数负责拆分单列内容,并将结果补空到指定长度:
split_and_pad <- function(col, target_length) { # 按"+"拆分每个单元格,空单元格返回空向量 split_list <- str_split(col, "\\+", simplify = FALSE) %>% map(~ if (.x == "") character(0) else .x) # 合并所有拆分后的元素 expanded <- unlist(split_list) # 计算需要补充的空字符串数量并补全 pad_length <- target_length - length(expanded) c(expanded, rep("", pad_length)) }
步骤3:计算最长列长度并生成结果
# 计算每列拆分后的元素总数 col_lengths <- map_dbl(df, function(col) { split_list <- str_split(col, "\\+", simplify = FALSE) %>% map(~ if (.x == "") character(0) else .x) length(unlist(split_list)) }) # 获取最大长度,作为所有列的目标行数 max_len <- max(col_lengths) # 对每列应用拆分补空函数,合并为新DataFrame df2 <- map_dfc(df, ~ split_and_pad(.x, max_len)) # 查看结果 print(df2, row.names = TRUE)
运行后得到的df2与你期望的结果完全一致。
内容的提问来源于stack exchange,提问作者Umar
相关产品推荐
相关产品推荐

