如何获取重复的行并迭代更改它们?
假设这个表列出了一年重复12次的情况,你如何有条件地更改它,使每年都是每个学生的一个日期(在几个月内迭代(?
这是开始的表格:
学生 | 日期 | 年级|
---|---|---|
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 |
您可以创建一个日期序列,从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