首页 > 解决方案 > 如何根据条件添加具有累进数字的列

问题描述

我正在尝试向我现有的数据集添加一列。数据集包含三列:

现在,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

我想得到的是不同的。对于数据收集的第一周,1应该报告,对于在第二周收集数据的学生,2应该报告,等等:

#   Student Week Day Obs
#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

标签: rdplyr

解决方案


一种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

它按“学生”列分组并计算非重复“周”值的累积总和。

或者:

fake.db %>%
 group_by(Student) %>%
 mutate(Obs = with(rle(Week), rep(seq_along(lengths), lengths)))

它按“学生”列分组,并在“周”列周围创建一个运行长度类型组 ID。

或者:

fake.db %>%
 group_by(Student) %>%
 mutate(Obs = dense_rank(Week))

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


推荐阅读