R语言计数存储到新数据框时出现重复数据问题
问题分析与解决方法
你的代码生成了重复的结果行,核心原因是嵌套循环逻辑过于复杂,变量状态管理出错,导致重复添加了不必要的记录。我们可以用dplyr包的分组向量化操作简化逻辑,精准实现需求:按werknemerID统计工作时长,当CAO变更时重新计数,并为ID添加_1、_2这类后缀。
正确实现代码
library(dplyr) # 测试数据集 dataset <- data.frame( persoonsid = c("abc","abc","abc","abc","abc","abc","abc","abc","abc"), werknemerID = c("ewrewr", "ewrewr", "ewrewr", "ewrewr", "ewrewr", "ewrewr", "blabla", "blabla", "blabla"), Maand = c("January", "February", "March", "April", "May", "June", "January", "February", "March"), Jaar = c(2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021), Code = c(82, 82, 82, 82, 82, 82, 82, 82, 82), CAO = c(40, 40, 40, 40, 35, 35, 40, 40, 40) ) # 定义月份顺序并转换为因子 maand_volgorde <- c("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December") dataset$Maand <- factor(dataset$Maand, levels = maand_volgorde) # 数据处理流程 resultaten <- dataset %>% # 按个人ID、员工ID、年份分组 group_by(persoonsid, werknemerID, Jaar) %>% # 按月份排序,保证时间顺序正确 arrange(Maand, .by_group = TRUE) %>% # 标记CAO变更点,生成连续CAO分组ID mutate( cao_change = CAO != lag(CAO, default = first(CAO)), cao_group = cumsum(cao_change) + 1 ) %>% # 按CAO分组进一步聚合 group_by(persoonsid, werknemerID, Jaar, cao_group, CAO) %>% # 统计每组的时长、首个月份 summarise( Count = n(), Eerste_Maand = as.character(first(Maand)), .groups = "drop" ) %>% # 为员工ID添加后缀(首组不加,后续组加_1、_2...) mutate( werknemerID = ifelse(cao_group == 1, werknemerID, paste0(werknemerID, "_", cao_group - 1)) ) %>% # 调整列顺序与预期一致 select(persoonsid, werknemerID, Count, Eerste_Maand, Jaar, CAO) # 输出结果 print(resultaten)
代码说明
- 分组与排序:先按
persoonsid、werknemerID、Jaar分组,再按月份排序,确保时间顺序正确。 - CAO分组标记:用
lag()函数对比当前行与上一行的CAO值,标记变更点;通过cumsum()生成连续的CAO分组ID。 - 聚合统计:按CAO分组统计每组的行数(工作时长)、首个月份。
- ID后缀添加:根据分组ID为员工ID添加后缀,首组保持原ID,后续组添加
_1、_2等。
运行后将得到你预期的结果:
# A tibble: 3 × 6 persoonsid werknemerID Count Eerste_Maand Jaar CAO <chr> <chr> <int> <chr> <dbl> <dbl> 1 abc ewrewr 4 January 2021 40 2 abc ewrewr_1 2 May 2021 35 3 abc blabla 3 January 2021 40
原代码问题总结
原嵌套循环逻辑繁琐,容易出现变量状态管理错误(如resultaten重复绑定、后缀计数错误),导致生成重复的结果行。使用dplyr的向量化分组操作可以避免这类问题,代码更简洁、可读性更高,也更易维护。
内容的提问来源于stack exchange,提问作者raveleijn1952
相关产品推荐
相关产品推荐

