我有数据显示受试者在 6-7 天内每天完成多次评分。每天的评分数量各不相同。该数据集包括主题 ID、日期和评级。我想创建一个新变量,将每个科目的日期重新编码为“学习日”——因此 1 表示第一天的评分,2 表示第二天的评分,等等。
例如,我想采用这个:
id Date Rating
1 10/20/2018 2
1 10/20/2018 3
1 10/20/2018 5
1 10/21/2018 1
1 10/21/2018 7
1 10/21/2018 9
1 10/22/2018 4
1 10/22/2018 5
1 10/22/2018 9
2 11/15/2018 1
2 11/15/2018 3
2 11/15/2018 4
2 11/16/2018 3
2 11/16/2018 1
2 11/17/2018 0
2 11/17/2018 2
2 11/17/2018 9
最后是这样的:
id Day Date Rating
1 1 10/20/2018 2
1 1 10/20/2018 3
1 1 10/20/2018 5
1 2 10/21/2018 1
1 2 10/21/2018 7
1 2 10/21/2018 9
1 3 10/22/2018 4
1 3 10/22/2018 5
1 3 10/22/2018 9
2 1 11/15/2018 1
2 1 11/15/2018 3
2 1 11/15/2018 4
2 2 11/16/2018 3
2 2 11/16/2018 1
2 3 11/17/2018 0
2 3 11/17/2018 2
2 3 11/17/2018 9
我打算考虑设置某种循环,但我认为值得询问是否有更有效的方法来实现这一点。是否有任何功能可以让我自动执行此类操作?非常感谢您的建议。
最佳答案
因为您想在每个 id
之后重置计数,使这个问题有点不同。
仅使用基本 R,我们可以 split
Date
基于id
然后创建每个不同组的计数。
df$Day <- unlist(sapply(split(df$Date, df$id), function(x) match(x,unique(x))))
df
# id Date Rating Day
#1 1 10/20/2018 2 1
#2 1 10/20/2018 3 1
#3 1 10/20/2018 5 1
#4 1 10/21/2018 1 2
#5 1 10/21/2018 7 2
#6 1 10/21/2018 9 2
#7 1 10/22/2018 4 3
#8 1 10/22/2018 5 3
#9 1 10/22/2018 9 3
#10 2 11/15/2018 1 1
#11 2 11/15/2018 3 1
#12 2 11/15/2018 4 1
#13 2 11/16/2018 3 2
#14 2 11/16/2018 1 2
#15 2 11/17/2018 0 3
#16 2 11/17/2018 2 3
#17 2 11/17/2018 9 3
我不知道我是如何错过这个的,但感谢@thelatemail,他提醒我这基本上与
library(dplyr)
df %>%
group_by(id) %>%
mutate(Day = match(Date, unique(Date)))
并且
df$Day <- as.numeric(with(df, ave(Date, id, FUN = function(x) match(x, unique(x)))))
关于将日期重新编码为主题内的学习日,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53808031/