R 重新编码科目内学习日的日期
我有数据显示,受试者在6-7天内每天完成多项评分。每天的收视率各不相同。数据集包括受试者ID、日期和评分。我想创建一个新变量,将每个科目的日期重新编码为“学习日”——因此1表示第一天的评分,2表示第二天的评分,等等 举个例子,我想说:R 重新编码科目内学习日的日期,r,recode,R,Recode,我有数据显示,受试者在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 1
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,我们可以基于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
及
df$Day如果您想要一个稍微有点粗糙的dplyr
版本……您可以使用日期列并将其转换为数字日期,然后操纵该数字以获得所需的结果
library(tidyverse)
library(lubridate)
df <- data_frame(id=c(1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2),
Date= c('10/20/2018', '10/20/2018', '10/20/2018', '10/21/2018', '10/21/2018', '10/21/2018',
'10/22/2018', '10/22/2018', '10/22/2018','11/15/2018', '11/15/2018', '11/15/2018',
'11/16/2018', '11/16/2018', '11/17/2018', '11/17/2018', '11/17/2018'),
Rating=c(2,3,5,1,7,9,4,5,9,1,3,4,3,1,0,2,9))
df %>%
group_by(id) %>%
mutate(
Date = mdy(Date),
Day = as.numeric(Date),
Day = Day-min(Day)+1)
# A tibble: 17 x 4
# Groups: id [2]
id Date Rating Day
<dbl> <date> <dbl> <dbl>
1 1 2018-10-20 2 1
2 1 2018-10-20 3 1
3 1 2018-10-20 5 1
4 1 2018-10-21 1 2
5 1 2018-10-21 7 2
6 1 2018-10-21 9 2
7 1 2018-10-22 4 3
8 1 2018-10-22 5 3
9 1 2018-10-22 9 3
10 2 2018-11-15 1 1
11 2 2018-11-15 3 1
12 2 2018-11-15 4 1
13 2 2018-11-16 3 2
14 2 2018-11-16 1 2
15 2 2018-11-17 0 3
16 2 2018-11-17 2 3
17 2 2018-11-17 9 3
库(tidyverse)
图书馆(lubridate)
df%
分组依据(id)%>%
变异(
日期=mdy(日期),
日期=数字形式(日期),
日=日最小值(日)+1)
#A tibble:17 x 4
#组别:id[2]
评税日
1 1 2018-10-20 2 1
2 1 2018-10-20 3 1
3 1 2018-10-20 5 1
4 1 2018-10-21 1 2
5 1 2018-10-21 7 2
6 1 2018-10-21 9 2
7 1 2018-10-22 4 3
8 1 2018-10-22 5 3
9 1 2018-10-22 9 3
10 2 2018-11-15 1 1
11 2 2018-11-15 3 1
12 2 2018-11-15 4 1
13 2 2018-11-16 3 2
14 2 2018-11-16 1 2
15 2 2018-11-17 0 3
16 2 2018-11-17 2 3
17 2 2018-11-17 9 3
太完美了!非常感谢您的帮助。split(df$Date,df$id,df$Date)
对我来说似乎很奇怪-我不认为您可以继续将更多参数传递给…
进行拆分<代码>拆分(df$Date,list(df$id,df$Date))
例如会给出不同的结果。@thelatemail ohh..等等!你是对的。我只需要按id
拆分它,不需要日期
。无论如何,我认为它忽略了df$Date。我会更新答案。谢谢。我也很惊讶-sapply+split
是tapply
,所以未列出(tapply(df$Date,df$id,FUN=function(x)match(x,unique(x)))
也会这样做,如果id总是有序的话。另外,ave
也可以通过相同的逻辑来实现-ave(如.numeric(df$Date),df$id,FUN=function(x)match(x,unique(x)))
是的,如果id是有序的,那么这些解决方案就可以工作,这也意味着这应该是一个重复?应该有答案给出这种输出。谢谢你的替代方法!
df$Day <- as.numeric(with(df, ave(Date, id, FUN = function(x) match(x, unique(x)))))
library(tidyverse)
library(lubridate)
df <- data_frame(id=c(1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2),
Date= c('10/20/2018', '10/20/2018', '10/20/2018', '10/21/2018', '10/21/2018', '10/21/2018',
'10/22/2018', '10/22/2018', '10/22/2018','11/15/2018', '11/15/2018', '11/15/2018',
'11/16/2018', '11/16/2018', '11/17/2018', '11/17/2018', '11/17/2018'),
Rating=c(2,3,5,1,7,9,4,5,9,1,3,4,3,1,0,2,9))
df %>%
group_by(id) %>%
mutate(
Date = mdy(Date),
Day = as.numeric(Date),
Day = Day-min(Day)+1)
# A tibble: 17 x 4
# Groups: id [2]
id Date Rating Day
<dbl> <date> <dbl> <dbl>
1 1 2018-10-20 2 1
2 1 2018-10-20 3 1
3 1 2018-10-20 5 1
4 1 2018-10-21 1 2
5 1 2018-10-21 7 2
6 1 2018-10-21 9 2
7 1 2018-10-22 4 3
8 1 2018-10-22 5 3
9 1 2018-10-22 9 3
10 2 2018-11-15 1 1
11 2 2018-11-15 3 1
12 2 2018-11-15 4 1
13 2 2018-11-16 3 2
14 2 2018-11-16 1 2
15 2 2018-11-17 0 3
16 2 2018-11-17 2 3
17 2 2018-11-17 9 3