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