如何在R中为仅含2条观测的指定ID补充随机日期的新观测行
R实现方案
依赖包
仅需使用dplyr包即可完成需求,如果你没有安装可以先运行install.packages("dplyr")安装。
完整代码
library(dplyr) # 原始数据 a <- structure(list(person_number = c(943927L, 943927L, 943927L, 943927L, 943927L, 943927L, 916248L, 916248L, 943579L, 943579L, 943579L, 943579L, 943579L, 943579L), position_code = c(801L, 801L, 801L, 801L, 801L, 801L, 5000690L, 5000690L, 5000690L, 5000690L, 5000690L, 5000690L, 5000690L, 5000690L), date = c(4L, 6L, 2L, 1L, 3L, 5L, 6L, 7L, 5L, 4L, 3L, 7L, 2L, 1L), start_hour = c(9L, 9L, 9L, 9L, 9L, 9L, 10L, 10L, 9L, 9L, 10L, 9L, 10L, 10L), end_hour = c(17L, 17L, 17L, 17L, 17L, 17L, 18L, 18L, 17L, 17L, 18L, 17L, 18L, 18L )), class = "data.frame", row.names = c(NA, -14L)) # 核心处理逻辑 result <- a %>% # 按销售人员ID分组 group_by(person_number) %>% group_modify(~ { # 仅处理只有2条观测的ID if(nrow(.x) == 2) { # 提取该ID未出现过的星期值(1-7为周一到周日的取值范围) available_dates <- setdiff(1:7, .x$date) # 随机选一个作为新行的date new_date <- sample(available_dates, 1) # 新行其他字段和该ID已有字段保持一致 new_row <- .x[1, ] new_row$date <- new_date # 合并原有行和新行 return(bind_rows(.x, new_row)) } # 不符合条件的ID直接返回原有数据 return(.x) }) %>% ungroup()
结果验证
执行以下代码查看符合条件的ID处理结果:
filter(result, person_number == 916248)
输出示例:
# A tibble: 3 × 5 person_number position_code date start_hour end_hour <int> <int> <int> <int> <int> 1 916248 5000690 6 10 18 2 916248 5000690 7 10 18 3 916248 5000690 1 10 18
注:新行的date值为随机抽取的该ID未出现过的星期值,每次运行结果可能不同,均符合需求
内容的提问来源于stack exchange,提问作者psysky
相关产品推荐
相关产品推荐

