你如何在 R 中迭代地改变观察?
How do you change observations iteratively in R?
如何获取重复的行并迭代更改它们?
鉴于这个假设 table 列出了重复 12 次的年份,您如何有条件地更改它,以便现在每年都是每个学生的日期(遍历月份)?
这是开头table:
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
结束table:
Store
Date
Grade
Walton
2018-01-01
.77
Walton
2018-02-01
.77
Walton
2018-03-01
.77
Walton
2018-04-01
.77
Walton
2018-05-01
.77
Walton
2018-06-01
.77
Walton
2018-07-01
.77
Walton
2018-08-01
.77
Walton
2018-09-01
.77
Walton
2018-10-01
.77
Walton
2018-11-01
.77
Walton
2018-12-01
.77
Sam
2018-01-01
.86
Sam
2018-02-01
.86
Sam
2018-03-01
.86
Sam
2018-04-01
.86
Sam
2018-05-01
.86
Sam
2018-06-01
.86
Sam
2018-07-01
.86
Sam
2018-08-01
.86
Sam
2018-09-01
.86
Sam
2018-10-01
.86
Sam
2018-11-01
.86
Sam
2018-12-01
.86
曾尝试使用 case_when
运行,但没有成功。抱歉,如果已经有人问过这个问题。
您可以创建一个日期序列,从 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
如何获取重复的行并迭代更改它们?
鉴于这个假设 table 列出了重复 12 次的年份,您如何有条件地更改它,以便现在每年都是每个学生的日期(遍历月份)?
这是开头table:
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 |
结束table:
Store | Date | Grade |
---|---|---|
Walton | 2018-01-01 | .77 |
Walton | 2018-02-01 | .77 |
Walton | 2018-03-01 | .77 |
Walton | 2018-04-01 | .77 |
Walton | 2018-05-01 | .77 |
Walton | 2018-06-01 | .77 |
Walton | 2018-07-01 | .77 |
Walton | 2018-08-01 | .77 |
Walton | 2018-09-01 | .77 |
Walton | 2018-10-01 | .77 |
Walton | 2018-11-01 | .77 |
Walton | 2018-12-01 | .77 |
Sam | 2018-01-01 | .86 |
Sam | 2018-02-01 | .86 |
Sam | 2018-03-01 | .86 |
Sam | 2018-04-01 | .86 |
Sam | 2018-05-01 | .86 |
Sam | 2018-06-01 | .86 |
Sam | 2018-07-01 | .86 |
Sam | 2018-08-01 | .86 |
Sam | 2018-09-01 | .86 |
Sam | 2018-10-01 | .86 |
Sam | 2018-11-01 | .86 |
Sam | 2018-12-01 | .86 |
曾尝试使用 case_when
运行,但没有成功。抱歉,如果已经有人问过这个问题。
您可以创建一个日期序列,从 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