如何为 r 中的嵌套组创建组索引

Azi*_*ggy 2 r

我有一个数据集,其中包含多个嵌套在个体中的观察结果。此示例数据集包括 id 和一周中的某天(dayweek,1-7)的列。我有来自每个人 3 天的观察结果。因此,一个人可能只提交了星期日/星期三/星期四 (1, 4, 5) 的报告,而另一个人可能提交了星期日/星期一/星期二 (1, 2, 3) 的报告,如下例所示:

df <- data.frame(
  id = c(rep(1:2, each = 6),2),
  dayweek = c(rep(c(1, 4, 5), each = 2),rep(c(1, 2, 3), each = 2), 3)
)
Run Code Online (Sandbox Code Playgroud)

我想设置一个列来标记每个人的第一天、第二天和第三天,如下所示:

df2 <- data.frame(
  id = c(rep(1:2, each = 6),2),
  dayweek = c(rep(c(1, 4, 5), each = 2),rep(c(1, 2, 3), each = 2), 3),
  daynum = c(rep(1:3, each = 2, times = 2), 3)
)
Run Code Online (Sandbox Code Playgroud)

我尝试使用

df %>% group_indices(id, dayweek) 
Run Code Online (Sandbox Code Playgroud)

但这会为每个单独的日期组合生成一个新的 ID。有什么好方法可以做到这一点?

提前致谢!

cro*_*gen 5

dplyr

使用cumsum和!duplicated与dplyr

df %>%
  group_by(id) %>%
  mutate(daynum = cumsum(!duplicated(dayweek)))


# A tibble: 13 x 3
# Groups:   id [2]
      id dayweek daynum
   <dbl>   <dbl>  <int>
 1     1       1      1
 2     1       1      1
 3     1       4      2
 4     1       4      2
 5     1       5      3
 6     1       5      3
 7     2       1      1
 8     2       1      1
 9     2       2      2
10     2       2      2
11     2       3      3
12     2       3      3
13     2       3      3
Run Code Online (Sandbox Code Playgroud)

tapply 从基地 R

unlist(tapply(df$dayweek, df$id, function(x) cumsum(!duplicated(x))))

 1  1  2  2  3  3  1  1  2  2  3  3  3 
Run Code Online (Sandbox Code Playgroud)