在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
相关产品推荐
相关产品推荐

