您如何獲取重復的行并迭代地更改它們?
給定這個列出年份重復 12 次的假設表,您如何有條件地更改它,以便現在每年都是每個學生的日期(遍歷月份)?
這是開始表:
| 學生 | 日期 | 年級 |
|---|---|---|
| 沃爾頓 | 2018 | .77 |
| 沃爾頓 | 2018 | .77 |
| 沃爾頓 | 2018 | .77 |
| 沃爾頓 | 2018 | .77 |
| 沃爾頓 | 2018 | .77 |
| 沃爾頓 | 2018 | .77 |
| 沃爾頓 | 2018 | .77 |
| 沃爾頓 | 2018 | .77 |
| 沃爾頓 | 2018 | .77 |
| 沃爾頓 | 2018 | .77 |
| 沃爾頓 | 2018 | .77 |
| 沃爾頓 | 2018 | .77 |
| 山姆 | 2018 | .86 |
| 山姆 | 2018 | .86 |
| 山姆 | 2018 | .86 |
| 山姆 | 2018 | .86 |
| 山姆 | 2018 | .86 |
| 山姆 | 2018 | .86 |
| 山姆 | 2018 | .86 |
| 山姆 | 2018 | .86 |
| 山姆 | 2018 | .86 |
| 山姆 | 2018 | .86 |
| 山姆 | 2018 | .86 |
| 山姆 | 2018 | .86 |
茶幾:
| 店鋪 | 日期 | 年級 |
|---|---|---|
| 沃爾頓 | 2018-01-01 | .77 |
| 沃爾頓 | 2018-02-01 | .77 |
| 沃爾頓 | 2018-03-01 | .77 |
| 沃爾頓 | 2018-04-01 | .77 |
| 沃爾頓 | 2018-05-01 | .77 |
| 沃爾頓 | 2018-06-01 | .77 |
| 沃爾頓 | 2018-07-01 | .77 |
| 沃爾頓 | 2018-08-01 | .77 |
| 沃爾頓 | 2018-09-01 | .77 |
| 沃爾頓 | 2018-10-01 | .77 |
| 沃爾頓 | 2018-11-01 | .77 |
| 沃爾頓 | 2018-12-01 | .77 |
| 山姆 | 2018-01-01 | .86 |
| 山姆 | 2018-02-01 | .86 |
| 山姆 | 2018-03-01 | .86 |
| 山姆 | 2018-04-01 | .86 |
| 山姆 | 2018-05-01 | .86 |
| 山姆 | 2018-06-01 | .86 |
| 山姆 | 2018-07-01 | .86 |
| 山姆 | 2018-08-01 | .86 |
| 山姆 | 2018-09-01 | .86 |
| 山姆 | 2018-10-01 | .86 |
| 山姆 | 2018-11-01 | .86 |
| 山姆 | 2018-12-01 | .86 |
已嘗試使用case_when不起作用的功能。對不起,如果這已經被問到了。
uj5u.com熱心網友回復:
您可以創建從 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)))
uj5u.com熱心網友回復:
您可以嘗試使用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
uj5u.com熱心網友回復:
這是另一種dplyr方法:
mutate一個從 1 到 12 的輔助列x,
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/431161.html
