如何使用dplyr合并分组内含NA的行,补齐数据框缺失值?
解决方法
你的问题出在使用了summarise_all——这个函数的作用是将每组聚合为单行,而你需要的是保留组内的有效行数,同时填充缺失的列值。
原因分析
你写的coalesce_by_column函数会把每组的所有行的同一列值传给dplyr::coalesce,而coalesce只会返回第一个非NA值,最终导致每组被压缩成一行。
针对当前数据的简洁实现代码
针对你提供的数据结构(前3行有TrialStim.ACC无TrialStim.RT,后3行相反),可以用以下代码直接得到期望结果:
library(dplyr) noMeancombinedNoiseTable.data <- noMeancombinedNoiseTable.data %>% group_by(RID, FlankerCongruence, NoiseLevel) %>% summarise( # 提取组内非NA的ACC值(组内ACC非NA值一致) TrialStim.ACC = first(na.omit(TrialStim.ACC)), # 提取组内所有非NA的RT值 TrialStim.RT = na.omit(TrialStim.RT), .groups = "drop_last" # 保留分组结构,和期望输出一致 )
通用适配方案(应对更复杂的对应关系)
如果后续数据中,同一组内TrialStim.ACC存在多个不同非NA值,需要和TrialStim.RT按位置对应填充,可以用以下代码:
library(dplyr) library(tidyr) noMeancombinedNoiseTable.data <- noMeancombinedNoiseTable.data %>% group_by(RID, FlankerCongruence, NoiseLevel) %>% # 给组内的行按对应关系编号 mutate(row_id = rep(1:3, 2) %>% sort()) %>% # 按行号分组,填充每组的缺失值 group_by(row_id, .add = TRUE) %>% summarise(across(everything(), ~first(na.omit(.x))), .groups = "drop_last") %>% select(-row_id)
这个方案能确保每一行的ACC和RT正确匹配,适配更多场景。
内容的提问来源于stack exchange,提问作者Samuel Uribe-Botero
相关产品推荐
相关产品推荐

