我正在嘗試根據變異列 ( Day) 是否具有有條件地插入Sys.Date()行Tue。如果是這樣,我想插入前兩天列出的行MaxDate。如果該Day列不是Tue,那么我只想保持資料框不變。我認為您不能if_else()在資料框上使用,并且不確定如何去做。也許add_row()以某種方式使用?
這就是我所擁有的:
| ID | 產品 | 最大日期 | 日 |
|---|---|---|---|
| 100 | 糖果 | 2022-01-18 | 周二 |
| 100 | 籌碼 | 2022-01-18 | 周二 |
| 101 | 糖果 | 2022-01-18 | 周二 |
| 101 | 籌碼 | 2022-01-18 | 周二 |
| 102 | 糖果 | 2022-01-18 | 周二 |
| 103 | 糖果 | 2022-01-13 | 周二 |
| 103 | 籌碼 | 2022-01-13 | 周二 |
如果是星期二,這就是我想要的:
| ID | 產品 | 最大日期 | 日 |
|---|---|---|---|
| 100 | 糖果 | 2022-01-16 | 周二 |
| 100 | 籌碼 | 2022-01-16 | 周二 |
| 100 | 糖果 | 2022-01-17 | 周二 |
| 100 | 籌碼 | 2022-01-17 | 周二 |
| 100 | 糖果 | 2022-01-18 | 周二 |
| 100 | 籌碼 | 2022-01-18 | 周二 |
| 101 | 糖果 | 2022-01-16 | 周二 |
| 101 | 籌碼 | 2022-01-16 | 周二 |
| 101 | 糖果 | 2022-01-17 | 周二 |
| 101 | 籌碼 | 2022-01-17 | 周二 |
| 101 | 糖果 | 2022-01-18 | 周二 |
| 101 | 籌碼 | 2022-01-18 | 周二 |
| 102 | 糖果 | 2022-01-16 | 周二 |
| 102 | 糖果 | 2022-01-17 | 周二 |
| 102 | 糖果 | 2022-01-18 | 周二 |
| 103 | 糖果 | 2022-01-16 | 周二 |
| 103 | 籌碼 | 2022-01-16 | 周二 |
| 103 | 糖果 | 2022-01-17 | 周二 |
| 103 | 籌碼 | 2022-01-17 | 周二 |
| 103 | 糖果 | 2022-01-13 | 周二 |
| 103 | 籌碼 | 2022-01-13 | 周二 |
如果不是,我希望資料框保持不變Tue:
| ID | 產品 | 最大日期 | 日 |
|---|---|---|---|
| 100 | 糖果 | 2022-01-17 | 星期一 |
| 100 | 籌碼 | 2022-01-17 | 星期一 |
| 101 | 糖果 | 2022-01-17 | 星期一 |
| 101 | 籌碼 | 2022-01-17 | 星期一 |
| 102 | 糖果 | 2022-01-17 | 星期一 |
| 103 | 糖果 | 2022-01-13 | 星期一 |
| 103 | 籌碼 | 2022-01-13 | 星期一 |
謝謝你。
uj5u.com熱心網友回復:
如果您需要對此進行概括,可能有一種更優雅的方法,但這很快并且可以完成作業:
bind_rows(
df,
df %>% filter(Day == "Tue") %>% mutate(MaxDate = MaxDate - 1),
df %>% filter(Day == "Tue") %>% mutate(MaxDate = MaxDate - 2)
) %>%
arrange(ID, MaxDate, Product)
# ID Product MaxDate Day
# 1 100 candy 2022-01-16 Tue
# 2 100 chips 2022-01-16 Tue
# 3 100 candy 2022-01-17 Tue
# 4 100 chips 2022-01-17 Tue
# 5 100 candy 2022-01-18 Tue
# 6 100 chips 2022-01-18 Tue
# 7 101 candy 2022-01-16 Tue
# 8 101 chips 2022-01-16 Tue
# 9 101 candy 2022-01-17 Tue
# 10 101 chips 2022-01-17 Tue
# 11 101 candy 2022-01-18 Tue
# 12 101 chips 2022-01-18 Tue
# 13 102 candy 2022-01-16 Tue
# 14 102 candy 2022-01-17 Tue
# 15 102 candy 2022-01-18 Tue
# 16 103 candy 2022-01-11 Tue
# 17 103 chips 2022-01-11 Tue
# 18 103 candy 2022-01-12 Tue
# 19 103 chips 2022-01-12 Tue
# 20 103 candy 2022-01-13 Tue
# 21 103 chips 2022-01-13 Tue
使用這個可重現的資料:
df = read.table(text = 'ID Product MaxDate Day
100 candy 2022-01-18 Tue
100 chips 2022-01-18 Tue
101 candy 2022-01-18 Tue
101 chips 2022-01-18 Tue
102 candy 2022-01-18 Tue
103 candy 2022-01-13 Tue
103 chips 2022-01-13 Tue', header = T) %>%
mutate(MaxDate = as.Date(MaxDate))
uj5u.com熱心網友回復:
library(dplyr, warn.conflicts = FALSE)
df = read.table(text = 'ID Product MaxDate Day
100 candy 2022-01-18 Tue
100 chips 2022-01-18 Tue
101 candy 2022-01-18 Tue
101 chips 2022-01-18 Tue
102 candy 2022-01-18 Tue
103 candy 2022-01-13 Wed
103 chips 2022-01-13 Tue', header = T) %>%
mutate(MaxDate = as.Date(MaxDate))
df %>%
left_join(tibble(Day = 'Tue', lagged_days = 2:0)) %>%
mutate(MaxDate = MaxDate - coalesce(lagged_days, 0),
lagged_days = NULL)
#> Joining, by = "Day"
#> ID Product MaxDate Day
#> 1 100 candy 2022-01-16 Tue
#> 2 100 candy 2022-01-17 Tue
#> 3 100 candy 2022-01-18 Tue
#> 4 100 chips 2022-01-16 Tue
#> 5 100 chips 2022-01-17 Tue
#> 6 100 chips 2022-01-18 Tue
#> 7 101 candy 2022-01-16 Tue
#> 8 101 candy 2022-01-17 Tue
#> 9 101 candy 2022-01-18 Tue
#> 10 101 chips 2022-01-16 Tue
#> 11 101 chips 2022-01-17 Tue
#> 12 101 chips 2022-01-18 Tue
#> 13 102 candy 2022-01-16 Tue
#> 14 102 candy 2022-01-17 Tue
#> 15 102 candy 2022-01-18 Tue
#> 16 103 candy 2022-01-13 Wed
#> 17 103 chips 2022-01-11 Tue
#> 18 103 chips 2022-01-12 Tue
#> 19 103 chips 2022-01-13 Tue
由reprex 包(v2.0.1)于 2022-01-18 創建
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/414686.html
標籤:
上一篇:處理日期格式錯誤的日期資料-R
