R语言:合并含大量NA值的连续行至新列的技术求助
R语言:合并含多NA的连续行至新列
问题分析
需要识别连续的、包含1个以上NA值的行,将这些行的所有元素合并后放入前一行的新列E中,最终仅保留每组的起始行(即不满足“含1个以上NA”条件的行)。
解决方案代码
先修正原数据中的字符串型"NA"为R原生NA,再通过分组实现合并:
# 加载dplyr包 library(dplyr) # 构造修正后的示例数据(将原数据中的"NA"替换为真正的NA) df <- data.frame( A = c(1,2,3,4,5,6), B = c(2, NA, NA, 5, NA, NA), C = c(1,2,NA,4,5,NA), D = c(3,NA,5,NA,NA,NA), stringsAsFactors = FALSE ) # 标记每行是否包含1个以上NA值 df <- df %>% mutate(has_many_na = rowSums(is.na(.)) > 1) # 创建分组ID:将非目标行(无1个以上NA)作为分组起点,后续连续目标行归为同一组 df <- df %>% mutate(group_id = cumsum(!has_many_na)) # 分组处理,生成结果 result <- df %>% group_by(group_id) %>% summarise( # 保留每组第一行的A-D列数据 across(A:D, ~first(.)), # 将组内剩余行的所有元素合并为一个向量,存入E列 E = list(unlist(.[-1, ])) ) %>% ungroup() %>% select(-group_id) # 输出结果 print(result)
代码说明
- 修正数据:原示例中的
"NA"是字符串类型,需转换为R原生的NA才能正确统计缺失值数量。 - 标记目标行:用
rowSums(is.na(.)) > 1判断每行是否包含1个以上NA,生成has_many_na标记列。 - 分组逻辑:通过
cumsum(!has_many_na)生成分组ID,每次遇到非目标行(即不需要合并的起始行)时,分组ID递增,后续连续的目标行自动归为同一组。 - 合并行数据:分组后保留每组第一行的A-D列,将组内其余行的所有元素合并为向量存入
E列(用list存储以适配不同长度的合并结果)。
输出结果
# A tibble: 2 × 5 A B C D E <dbl> <dbl> <dbl> <dbl> <list> 1 1 2 1 3 <dbl [8]> 2 4 5 4 NA <dbl [8]>
查看E列具体内容可使用result$E,得到:
- 第一个元素:
c(2, NA, 2, NA, 3, NA, NA, 5) - 第二个元素:
c(5, NA, 5, NA, 6, NA, NA, NA),与需求完全匹配。
内容的提问来源于stack exchange,提问作者ctk1100
相关产品推荐
相关产品推荐

