如何在R中按条件合并行?PDF转DataFrame换行拆分问题求助
解决PDF表格转DataFrame时的单元格换行合并问题
这个问题我处理PDF导出表格时也碰到过,核心思路是按第一列的非NA值分组,把每组内的多行内容合并成一行。下面给你两种实现方式,分别用dplyr(tidyverse风格)和Base R:
第一步:先还原你的示例数据
首先把你提供的示例数据转换成可运行的R代码:
library(tibble) df <- tibble( V1 = c(1L, NA, NA, 2L, NA, NA), V2 = c("Chawla Associates", "Architects, Interior", "Designers", "J Square", "Designers &", "Engineering"), V3 = c("B-102, Sanik Nagar,", "Uttam Nagar, New", "Delhi-110059", "H-office: H No.1031,", "Sec-67, Mohali (PB)", "431-432, Sec-8,"), V4 = c("253336493", "M-", "9.51242E+11", "M-9872815438", "M-98722-22676", NA), V5 = c("-", NA, NA, "Telefax-", "0172-", "2574602"), V6 = c("Abhi2874@yahoo.co.in", NA, NA, "vincaljaidka@hotmail.co", "m", NA), V7 = c("CA/99/24551", NA, NA, "CA/96/20742", NA, NA ) )
方法一:用dplyr(推荐,代码更简洁直观)
如果已经安装了dplyr包,直接用分组聚合的方式处理:
library(dplyr) merged_df <- df %>% # 创建分组标识:每个非NA的V1对应一个新组 mutate(group = cumsum(!is.na(V1))) %>% # 按分组聚合 group_by(group) %>% summarise( V1 = first(V1), # 取组内第一个非NA的V1值 # 对V2到V7的每列,拼接非NA内容(用空格分隔) across(V2:V7, ~ paste(na.omit(.), collapse = " ")) ) %>% select(-group) # 移除临时分组列 # 查看结果 merged_df
运行后会得到你想要的结构:每组(对应原数据中一个完整的条目)合并成一行,单元格内的换行内容被拼接成完整字符串。
方法二:用Base R(无需额外安装包)
如果不想安装tidyverse包,用Base R也能实现:
# 创建分组标识 group_ids <- cumsum(!is.na(df$V1)) # 按分组处理每一组 merged_df_base <- do.call(rbind, lapply(split(df, group_ids), function(group_data) { data.frame( V1 = group_data$V1[!is.na(group_data$V1)][1], V2 = paste(na.omit(group_data$V2), collapse = " "), V3 = paste(na.omit(group_data$V3), collapse = " "), V4 = paste(na.omit(group_data$V4), collapse = " "), V5 = paste(na.omit(group_data$V5), collapse = " "), V6 = paste(na.omit(group_data$V6), collapse = " "), V7 = paste(na.omit(group_data$V7), collapse = " "), stringsAsFactors = FALSE ) })) # 重置行名 rownames(merged_df_base) <- NULL # 查看结果 merged_df_base
关键逻辑说明
两种方法的核心都是用cumsum(!is.na(V1))生成分组标识:
!is.na(V1)会把第一列的非NA值转为TRUE(等价于1),NA值转为FALSE(等价于0)cumsum累加后,每个新的非NA行都会生成一个新的分组编号,后续的NA行自动归到前一个分组中,这样就能把属于同一个条目的多行数据归为一组,再通过paste拼接成完整内容。
内容的提问来源于stack exchange,提问作者Domnick
相关产品推荐
相关产品推荐

