R 如何根据条件添加具有累进编号的列

R 如何根据条件添加具有累进编号的列,r,dplyr,R,Dplyr,我正在尝试向现有数据集中添加列。 数据集有三列: 作为参与者ID列的学生, Week收集数据的一年中的周数, 和 Day—在工作日内收集数据的编号 收集。 现在,我正在尝试创建一个新的列Obs,其中包含一个从1到n的累进数,表示每个学生接受测试的那一周 我曾尝试将group_by与rep结合使用,但似乎没有产生我想要的结果: Week <- c(1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 4) Day <- c(1, 2, 3, 2, 3, 5, 1, 3, 2

我正在尝试向现有数据集中添加列。 数据集有三列:

作为参与者ID列的学生, Week收集数据的一年中的周数, 和 Day—在工作日内收集数据的编号 收集。 现在,我正在尝试创建一个新的列Obs,其中包含一个从1到n的累进数,表示每个学生接受测试的那一周

我曾尝试将group_by与rep结合使用,但似乎没有产生我想要的结果:

Week <- c(1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 4)
Day <- c(1, 2, 3, 2, 3, 5, 1, 3, 2, 3, 4, 5)
Student <- c("A", "A", "A", "B", "B", "B", "B", "B", "C", "C", "C", "C")
fake.db <- data.frame(Student, Week, Day)

library(dplyr)
fake.db %>%
  group_by(Student) %>% 
  mutate(Obs = rep(1:length(Student), each = Week))
#   Student  Week   Day   Obs
#   <fct>   <dbl> <dbl> <int>
# 1 A           1     1     1
# 2 A           1     2     2
# 3 A           1     3     3
# 4 B           2     2     1
# 5 B           2     3     2
# 6 B           2     5     3
# 7 B           3     1     4
# 8 B           3     3     5
# 9 C           4     2     1
#10 C           4     3     2
#11 C           4     4     3
#12 C           4     5     4
dplyr的一种可能性是:

fake.db %>%
 group_by(Student) %>%
 mutate(Obs = cumsum(!duplicated(Week)))

  Student  Week   Day   Obs
   <fct>   <dbl> <dbl> <int>
 1 A           1     1     1
 2 A           1     2     1
 3 A           1     3     1
 4 B           2     2     1
 5 B           2     3     1
 6 B           2     5     1
 7 B           3     1     2
 8 B           3     3     2
 9 C           4     2     1
10 C           4     3     1
11 C           4     4     1
12 C           4     5     1
它按学生列分组,并围绕周列创建一个运行长度类型组ID

或:

它按学生列分组,并在周列中对值进行排序。

一种dplyr可能是:

fake.db %>%
 group_by(Student) %>%
 mutate(Obs = cumsum(!duplicated(Week)))

  Student  Week   Day   Obs
   <fct>   <dbl> <dbl> <int>
 1 A           1     1     1
 2 A           1     2     1
 3 A           1     3     1
 4 B           2     2     1
 5 B           2     3     1
 6 B           2     5     1
 7 B           3     1     2
 8 B           3     3     2
 9 C           4     2     1
10 C           4     3     1
11 C           4     4     1
12 C           4     5     1
它按学生列分组,并围绕周列创建一个运行长度类型组ID

或:


它按学生列分组,并在“周”列中对值进行排序。

我的理解是,您要计算每个学生自第一个考试周起的周数。也就是说,第2周是学生B的第一周测试,因此Obs=1。这意味着您可以进行分组变异:

图书馆弹琴 假的。分贝% 学生分组%>% mutateObs=Week-minWeek+1 >一个tibble:12x4 >分组:学生[3] >学生工作日 > >一一 >2 A 1 2 1 >3 A 1 3 1 >4 B 2 1 >5B231 >6B251 >7 B 3 1 2 >8B32 >9C421 >10 C 4 3 1 >11 C 4 1 >12 C 4 5 1
由v0.2.1于2019-05-10创建,据我所知,问题是您希望计算每个学生自第一个考试周起的周数。也就是说,第2周是学生B的第一周测试,因此Obs=1。这意味着您可以进行分组变异:

图书馆弹琴 假的。分贝% 学生分组%>% mutateObs=Week-minWeek+1 >一个tibble:12x4 >分组:学生[3] >学生工作日 > >一一 >2 A 1 2 1 >3 A 1 3 1 >4 B 2 1 >5B231 >6B251 >7 B 3 1 2 >8B32 >9C421 >10 C 4 3 1 >11 C 4 1 >12 C 4 5 1
由v0.2.1于2019-05-10创建,您可以查看是否存在非零差异

fake.db %>%
  group_by(Student) %>% 
  arrange(Week) %>%
  mutate(Obs = cumsum(c(1, diff(Week)!=0)))
或者,如果它们的值不是数字,则可以与滞后值进行比较

fake.db %>%
  group_by(Student) %>% 
  arrange(Week) %>%
  mutate(Obs = cumsum(Week != lag(Week, default=first(Week))) + 1)

您可以看到是否存在非零差异

fake.db %>%
  group_by(Student) %>% 
  arrange(Week) %>%
  mutate(Obs = cumsum(c(1, diff(Week)!=0)))
或者,如果它们的值不是数字,则可以与滞后值进行比较

fake.db %>%
  group_by(Student) %>% 
  arrange(Week) %>%
  mutate(Obs = cumsum(Week != lag(Week, default=first(Week))) + 1)
一种简单的方法

资料

一种简单的方法

资料

unlist(by(fake.db, fake.db[, 1], function(x) as.numeric(factor(x[, 2]))))
# A1 A2 A3 B1 B2 B3 B4 B5 C1 C2 C3 C4 
#  1  1  1  1  1  1  2  2  1  1  1  1
fake.db <- structure(list(Student = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 3L, 3L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor"), 
    Week = c(1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 4), Day = c(1, 
    2, 3, 2, 3, 5, 1, 3, 2, 3, 4, 5)), class = "data.frame", row.names = c(NA, 
-12L))