如何在R语言的分组数据框中添加指定缺失行?
按日期和活动分组后补全所有指定名称的行
需求说明
需要对数据框按date(日期)和drill(活动)两个变量分组,确保每个分组都包含预定义列表name_list中的所有名称。若分组内缺失某个名称,需新增对应行,并将该行的duration(时长)设为0,代表该人员未参与该日期的该活动。
示例数据
library(tidyverse) # 需补全的名称列表 name_list <- c(paste("Person", LETTERS[1:8])) set.seed(10) name <- c(name_list[3:8], name_list[1:6], name_list[2:7], name_list[3:8]) date <- rep(seq(as.Date('2023/01/01'), as.Date('2023/01/02'), by = "day"), each = 12) drill <- rep(paste("Activity", 1:2), each = 6, times = 2) duration <- rep(c(5, 8), each = 6, times = 2) df <- data.frame(name, date, drill, duration)
解决方案
使用tidyverse工具链,通过生成所有可能的分组-名称组合,再与原数据左连接,最后填充缺失值即可实现需求:
# 生成所有date、drill、name的完整组合 full_combinations <- expand_grid( date = unique(df$date), drill = unique(df$drill), name = name_list ) # 左连接原数据,补全缺失行并将duration的NA替换为0 df_complete <- full_combinations %>% left_join(df, by = c("date", "drill", "name")) %>% mutate(duration = replace_na(duration, 0))
代码说明
expand_grid:生成date、drill、name三个变量的所有可能组合,确保每个日期-活动分组都包含所有指定名称。left_join:将完整组合与原数据连接,原数据中不存在的组合会保留行,但duration列会为NA。replace_na:将duration列的NA值替换为0,符合“未参与则时长为0”的需求。
验证结果
以2023-01-01/Activity 1分组为例,原数据缺少Person A和Person B,处理后这两个名称的行已被新增,且duration为0:
df_complete %>% filter(date == "2023-01-01", drill == "Activity 1")
输出结果:
name date drill duration 1 Person A 2023-01-01 Activity 1 0 2 Person B 2023-01-01 Activity 1 0 3 Person C 2023-01-01 Activity 1 5 4 Person D 2023-01-01 Activity 1 5 5 Person E 2023-01-01 Activity 1 5 6 Person F 2023-01-01 Activity 1 5 7 Person G 2023-01-01 Activity 1 5 8 Person H 2023-01-01 Activity 1 5
内容的提问来源于stack exchange,提问作者user13973103
相关产品推荐
相关产品推荐

