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

在R语言中如何合并含NA的相邻行并补全数据

解决每两行合并为完整记录的问题

你的数据特征很明确:每两行对应一条完整记录,两行的NA值互补,第一行有名字,第二行有年龄和性别。下面是两种直接的解决方法:

方法一:用dplyr包(推荐,代码更清晰)

先加载dplyr,通过分组聚合提取非NA值:

library(dplyr)

# 原始数据
df <- data.frame(Name=c("Steve",NA,"Jim",NA,"Patty",NA),Age=c(NA,26,NA,41,NA,37),Gender=c(NA,"M",NA,"M",NA,"F"))

# 生成分组标签(每2行一组),然后每组提取有效数据
df_cleaned <- df %>%
  mutate(group = rep(1:(nrow(df)/2), each=2)) %>%
  group_by(group) %>%
  summarize(
    Name = first(na.omit(Name)),
    Age = first(na.omit(Age)),
    Gender = first(na.omit(Gender))
  ) %>%
  select(-group)

print(df_cleaned)

运行后得到的干净数据就是:

Name Age Gender
1  Steve  26      M
2    Jim  41      M
3  Patty  37      F

方法二:Base R原生实现(无需额外安装包)

如果不想用dplyr,用基础R代码也能搞定:

# 原始数据
df <- data.frame(Name=c("Steve",NA,"Jim",NA,"Patty",NA),Age=c(NA,26,NA,41,NA,37),Gender=c(NA,"M",NA,"M",NA,"F"))

# 按每2行拆分数据,每组提取非NA值后合并
groups <- split(df, rep(1:(nrow(df)/2), each=2))
df_cleaned <- do.call(rbind, lapply(groups, function(x) {
  data.frame(
    Name = x$Name[!is.na(x$Name)],
    Age = x$Age[!is.na(x$Age)],
    Gender = x$Gender[!is.na(x$Gender)]
  )
}))

print(df_cleaned)

两种方法都能得到你需要的完整记录,选哪种全看你平时的使用习惯。

内容的提问来源于stack exchange,提问作者T_R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:10:16