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

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)

代码说明

  1. 分组与排序:先按persoonsid、werknemerID、Jaar分组,再按月份排序,确保时间顺序正确。
  2. CAO分组标记:用lag()函数对比当前行与上一行的CAO值,标记变更点;通过cumsum()生成连续的CAO分组ID。
  3. 聚合统计:按CAO分组统计每组的行数(工作时长)、首个月份。
  4. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 10:42:32