你如何在 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