如何清洗R dataframe数据 将多列对应的两行合并为单行
数据清洗需求说明
现有R dataframe原始格式如下:
需要清洗转换为如下目标格式,将对应同一条记录的两行数据合并为一行完整数据:
实现方案
方法1:tidyverse实现(推荐)
首先加载依赖包:
library(tidyverse)
如果原始数据的空白值为NA,直接执行如下代码(假设原始数据框名为df):
df_clean <- df %>% # 每两行划分为一组,对应一条完整记录 mutate(group_id = rep(1:(n()/2), each = 2)) %>% group_by(group_id) %>% # 组内提取每列的非空值完成合并 summarise(across(everything(), ~na.omit(.x)[1])) %>% ungroup() %>% # 移除辅助分组列 select(-group_id)
如果原始数据的空白值为空字符串而非NA,先统一转成NA再处理:
df_clean <- df %>% # 空字符串转换为NA mutate(across(everything(), ~ifelse(str_squish(.x) == "", NA, .x))) %>% mutate(group_id = rep(1:(n()/2), each = 2)) %>% group_by(group_id) %>% summarise(across(everything(), ~na.omit(.x)[1])) %>% ungroup() %>% select(-group_id)
方法2:base R实现
# 生成辅助分组ID group_id <- rep(1:(nrow(df)/2), each = 2) # 按组聚合,提取每列非空值 df_clean <- aggregate(. ~ group_id, df, function(x) na.omit(x)[1], na.action = na.pass) # 删除辅助分组列 df_clean$group_id <- NULL
注意事项
如果数据的分组规则不是严格每两行对应一条记录,按需调整group_id的生成逻辑即可适配。
内容的提问来源于stack exchange,提问作者KosiB
相关产品推荐
相关产品推荐

