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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:53:12