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

如何按教师姓名拆分DataFrame并标记5天及以上连续缺勤

按教师姓名拆分数据框并分析连续缺勤记录

一、将数据拆分为以教师姓名命名的独立DataFrame

你使用split(absences, absences$name)得到的是一个列表对象,每个列表元素对应一位教师的数据。要将这些元素转换为全局环境中以姓名命名的独立DataFrame,只需使用list2env()函数:

# 按姓名拆分数据为列表
teacher_data_list <- split(absences, absences$name)
# 将列表元素转为全局环境中的独立DataFrame
list2env(teacher_data_list, envir = .GlobalEnv)

执行后,你就能直接调用Kara、Sam、Barbie等独立的DataFrame,完全符合你期望的输出格式。

关于你之前的错误解释

你尝试split(absences, teachername)时出现的data length is not a multiple of split variable错误,是因为teachername是长度为5的唯一姓名向量,但原数据有9行。split()要求拆分变量的长度必须与数据行数一致,正确的拆分变量应该是原数据的name列(与数据行数完全匹配)。


二、更高效的连续缺勤分析(无需拆分数据)

实际上,分析连续5天及以上的缺勤记录不需要拆分数据,直接用dplyr分组处理更简洁高效,还能避免创建过多全局对象:

library(dplyr)

# 标记连续5天及以上的缺勤记录
long_absences <- absences %>%
  # 按教师ID和姓名分组(确保同一教师的记录被归在一起)
  group_by(staffid, name) %>%
  # 按日期排序,保证时间顺序正确
  arrange(date) %>%
  # 计算当前日期与上一条记录日期的间隔
  mutate(date_gap = date - lag(date)) %>%
  # 用cumsum创建连续缺勤的分组标识:间隔不为1天或为首条记录时,开启新分组
  mutate(absence_group = cumsum(is.na(date_gap) | date_gap != 1)) %>%
  # 按缺勤分组计算连续天数
  group_by(staffid, name, absence_group) %>%
  mutate(continuous_absence_days = n()) %>%
  # 筛选出连续缺勤≥5天的记录
  filter(continuous_absence_days >= 5) %>%
  # 取消分组,便于后续处理
  ungroup()

# 查看结果
print(long_absences)

这段代码的逻辑:

  1. 按教师分组后排序日期,确保时间序列正确
  2. 计算相邻记录的日期差,判断是否为连续缺勤(间隔1天)
  3. 用cumsum为每一段连续缺勤创建唯一分组ID
  4. 计算每个分组的连续天数,筛选出符合条件的记录

内容的提问来源于stack exchange,提问作者Janelle Haire

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:43:09