基于shift列生成day列:每2组shift对应1天的R语言实现问题
问题:生成符合规则的day列
需求是创建day列,规则为每2组shift(每组包含shift 1和shift 2各两次)对应一天,总共生成150天的数据。示例数据如下:
shift day 1 1 1 2 1 1 3 2 1 4 2 1 5 1 2 6 1 2 7 2 2 8 2 2 9 1 3 10 1 3 11 2 3 12 2 3
尝试的R代码:
df_ <- data.frame(shift=rep(1:2,each=8,time=2)) x3 = df_ %>% mutate(day = case_when( row_number() == 1 ~ 0, df_== lag(df_) ~ 1, TRUE ~ 2 ))
运行结果不符合预期,错误结果:
shift day 1 1 0 2 1 1 3 1 1 4 1 1 5 1 1 6 1 1 7 1 1 8 1 1 9 2 2 10 2 1 11 2 1 12 2 1 13 2 1 14 2 1 15 2 1 16 2 1 17 1 2 18 1 1 19 1 1 20 1 1 21 1 1 22 1 1 23 1 1 24 1 1 25 2 2
正确实现方法
首先明确核心规则:每天对应4条记录,顺序固定为1,1,2,2,150天共生成600条数据。以下两种方法均可实现需求:
方法1:直接构造完整数据集
利用rep函数直接生成符合规则的shift和day列,一步到位:
df <- data.frame( shift = rep(c(1, 1, 2, 2), times = 150), day = rep(1:150, each = 4) )
方法2:基于行号计算(适合已有shift列的场景)
如果已经有按规则排列的shift列,可通过行号分组计算day:
library(dplyr) # 先构造符合规则的shift列 df_ <- data.frame(shift = rep(c(1, 1, 2, 2), times = 150)) # 按每4行一组分配day编号 df_ <- df_ %>% mutate(day = (row_number() - 1) %/% 4 + 1)
代码解释
rep(c(1,1,2,2), times=150):重复1,1,2,2序列150次,完美匹配150天的shift数据规则(row_number() -1) %/%4 +1:行号减1后整除4,得到从0开始的分组索引,加1后转为从1开始的day编号,确保每4行对应同一个day值
验证前12条记录:
head(df, 12)
输出与示例数据完全一致:
shift day 1 1 1 2 1 1 3 2 1 4 2 1 5 1 2 6 1 2 7 2 2 8 2 2 9 1 3 10 1 3 11 2 3 12 2 3
内容的提问来源于stack exchange,提问作者Malvis Va
相关产品推荐
相关产品推荐

