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

如何在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))

代码说明

  1. expand_grid:生成date、drill、name三个变量的所有可能组合,确保每个日期-活动分组都包含所有指定名称。
  2. left_join:将完整组合与原数据连接,原数据中不存在的组合会保留行,但duration列会为NA。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:33:20