R 重新编码科目内学习日的日期

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

我有数据显示,受试者在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,我们可以基于
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