基于分组计数的R数据框sleep列NA值填充需求
解决方案:用分组众数填充NA值
先复现你的数据:
group = c(1,1,4,4,4,5,5,6,1,4,6,1,1,1,1,6,4,4,4,4,1,4,5,6) animal = c('a','b','c','c','d','a','b','c','b','d','c','a','a','a','a','c','c','c','c','c','a','c','a','c') sleep = c('y','n','y','y','y','n','n','y','n','y','n','y','y','n','m','y','n','n','n','n',NA, NA, NA, NA) test = data.frame(group, animal, sleep)
你的需求是:针对test数据框中sleep列的NA值,按照group和animal的分组,用该分组内计数最高的sleep值进行填充。
实现代码
library(dplyr) # 1. 计算每个(group, animal)分组下的sleep众数(最高计数的取值) mode_df <- test %>% group_by(group, animal) %>% filter(!is.na(sleep)) %>% # 排除NA,避免干扰计数 count(sleep, sort = TRUE) %>% # 按计数降序排列 slice(1) %>% # 取每组计数最高的那一行 ungroup() %>% select(group, animal, sleep_mode = sleep) # 重命名列方便后续连接 # 2. 将众数映射回原数据框,填充NA test_filled <- test %>% left_join(mode_df, by = c("group", "animal")) %>% mutate(sleep = ifelse(is.na(sleep), sleep_mode, sleep)) %>% select(-sleep_mode) # 移除临时列 print(test_filled)
代码说明
- 第一步里,
count(sleep, sort = TRUE)会按分组统计sleep各取值的出现次数并降序排列,slice(1)直接提取每组计数最高的取值作为分组众数; - 第二步通过
left_join把分组众数匹配到原数据,再用ifelse替换sleep列的NA值; - 如果分组内有多个
sleep值计数并列最高,slice(1)会取排序后的第一个值,若需处理这种情况,可根据需求调整逻辑(比如保留所有并列值或自定义选择规则)。
结果验证
- Group 1、Animal a的
sleep值中,'y'出现4次,是计数最高的,因此对应NA会被填充为'y'; - Group 4、Animal c的
sleep值中,'n'出现5次,是计数最高的,对应NA会被填充为'n',完全符合你的预期。
内容的提问来源于stack exchange,提问作者Michael Zhao
相关产品推荐
相关产品推荐

