你如何在R中迭代地改变观察结果



如何获取重复的行并迭代更改它们?

假设这个表列出了一年重复12次的情况,你如何有条件地更改它,使每年都是每个学生的一个日期(在几个月内迭代(?

这是开始的表格:

年级.77.77.77.77.77.77.77.77.77.77.77
学生 日期
Walton 2018 .77
Walton 2018
Walton 2018
Walton 2018
Walton 2018
Walton 2018
Walton 2018
Walton 2018
Walton 2018
Walton 2018
Walton 2018
Walton 2018
Sam 2018 .86
Sam 2018 .86
Sam 2018 .86
Sam 2018 .86
Sam 2018 .86
Sam 2018 .86
Sam 2018 .86
Sam 2018 .86
Sam 2018 .86
Sam 2018 .86
Sam 2018 .86
Sam 2018 .86

您可以创建一个日期序列,从1月1日开始,间隔1个月,长度为每组观察次数。

df %>% 
group_by(Student) %>% 
mutate(Date = seq(as.Date(ISOdate(first(Date), 1, 1)), by = '1 month', length.out = n()))
Student Date       Grade
<chr>   <date>     <dbl>
1 Walton  2018-01-01  0.77
2 Walton  2018-02-01  0.77
3 Walton  2018-03-01  0.77
4 Walton  2018-04-01  0.77
5 Walton  2018-05-01  0.77
6 Walton  2018-06-01  0.77
7 Walton  2018-07-01  0.77
8 Walton  2018-08-01  0.77
9 Walton  2018-09-01  0.77
10 Walton  2018-10-01  0.77
# ... with 14 more rows

如果您可以手动添加日期,则使用:

seq(as.Date("2018-01-01"), by = '1 month', length.out = n())

如果你知道每组将有12个观察结果,请使用:

seq(as.Date("2018-01-01"), as.Date("2018-12-01"))

使用lubridate,另一个选项是使用%m+%运算符:

library(lubridate)
df %>% 
group_by(Student) %>% 
mutate(Date = ymd(first(Date), truncated = 2) %m+% months(c(0:11)))

您可以尝试使用data.table包:

library(data.table)
library(lubridate)
library(magrittr)
dt <- fread("
Student Date    Grade
Walton  2018    .77
Walton  2018    .77
Walton  2018    .77
Walton  2018    .77
Walton  2018    .77
Walton  2018    .77
Walton  2018    .77
Walton  2018    .77
Walton  2018    .77
Walton  2018    .77
Walton  2018    .77
Walton  2018    .77
Sam 2018    .86
Sam 2018    .86
Sam 2018    .86
Sam 2018    .86
Sam 2018    .86
Sam 2018    .86
Sam 2018    .86
Sam 2018    .86
Sam 2018    .86
Sam 2018    .86
Sam 2018    .86
Sam 2018    .86")
dt[,Month := 1:.N, by = Student] %>%
.[, NewDate := make_date (Date, Month, 1)]

结果如下:

> dt
Student Date Grade Month    NewDate
1:  Walton 2018  0.77     1 2018-01-01
2:  Walton 2018  0.77     2 2018-02-01
3:  Walton 2018  0.77     3 2018-03-01
4:  Walton 2018  0.77     4 2018-04-01
5:  Walton 2018  0.77     5 2018-05-01
6:  Walton 2018  0.77     6 2018-06-01
7:  Walton 2018  0.77     7 2018-07-01
8:  Walton 2018  0.77     8 2018-08-01
9:  Walton 2018  0.77     9 2018-09-01
10:  Walton 2018  0.77    10 2018-10-01
11:  Walton 2018  0.77    11 2018-11-01
12:  Walton 2018  0.77    12 2018-12-01
13:     Sam 2018  0.86     1 2018-01-01
14:     Sam 2018  0.86     2 2018-02-01
15:     Sam 2018  0.86     3 2018-03-01
16:     Sam 2018  0.86     4 2018-04-01
17:     Sam 2018  0.86     5 2018-05-01
18:     Sam 2018  0.86     6 2018-06-01
19:     Sam 2018  0.86     7 2018-07-01
20:     Sam 2018  0.86     8 2018-08-01
21:     Sam 2018  0.86     9 2018-09-01
22:     Sam 2018  0.86    10 2018-10-01
23:     Sam 2018  0.86    11 2018-11-01
24:     Sam 2018  0.86    12 2018-12-01
Student Date Grade Month    NewDate

这里是另一种dplyr方法:

mutate辅助列x,具有1到12,

paste将其放在一起并将其包裹在as.Date

library(dplyr)
df %>% 
mutate(x = rep(1:12, length.out = n()),
Date = as.Date(paste(Date,x,"01",sep = "-")), .keep="unused")
Student       Date Grade
1   Walton 2018-01-01  0.77
2   Walton 2018-02-01  0.77
3   Walton 2018-03-01  0.77
4   Walton 2018-04-01  0.77
5   Walton 2018-05-01  0.77
6   Walton 2018-06-01  0.77
7   Walton 2018-07-01  0.77
8   Walton 2018-08-01  0.77
9   Walton 2018-09-01  0.77
10  Walton 2018-10-01  0.77
11  Walton 2018-11-01  0.77
12  Walton 2018-12-01  0.77
13     Sam 2018-01-01  0.86
14     Sam 2018-02-01  0.86
15     Sam 2018-03-01  0.86
16     Sam 2018-04-01  0.86
17     Sam 2018-05-01  0.86
18     Sam 2018-06-01  0.86
19     Sam 2018-07-01  0.86
20     Sam 2018-08-01  0.86
21     Sam 2018-09-01  0.86
22     Sam 2018-10-01  0.86
23     Sam 2018-11-01  0.86
24     Sam 2018-12-01  0.86

最新更新