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

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)

代码说明

  1. 修正数据:原示例中的"NA"是字符串类型,需转换为R原生的NA才能正确统计缺失值数量。
  2. 标记目标行:用rowSums(is.na(.)) > 1判断每行是否包含1个以上NA,生成has_many_na标记列。
  3. 分组逻辑:通过cumsum(!has_many_na)生成分组ID,每次遇到非目标行(即不需要合并的起始行)时,分组ID递增,后续连续的目标行自动归为同一组。
  4. 合并行数据:分组后保留每组第一行的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 17:25:31