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

基于分组计数的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 03:03:22