我有以下数据框:
Group<-c(A,A,A,B,B,B)
Dates<-(c("01-01-2000","02-01-2000","03-01-2000","01-05-2020","02-05-2020","03-05-2020"))
Departure<-c("01-01-2000","01-01-2000","01-01-2000",NA,NA,NA)
Arrival<-c(NA,NA,NA,"03-02-2020","03-02-2020","03-02-2020")
Dates<-data.frame(Dates,Departure,Arrival)
Dates
Group Dates Departure Arrival
1 01-01-2000 02-01-2000 <NA>
1 02-01-2000 02-01-2000 <NA>
1 03-01-2000 02-01-2000 <NA>
2 01-05-2000 <NA> 31-12-2020
2 02-05-2000 <NA> 31-12-2020
2 03-05-2000 <NA> 31-12-2020
这是我想做的:
- 对于“出发”列:如果值不是 NA,则保持原样。如果该值为 NA,则替换为每个组中“日期”列的第一个值。
- 对于“到达”列:如果该值不是 NA,则保持原样。如果该值为 NA,则替换为每个组中“日期”列的最后一个值。
然后我将获得以下数据框:
Group Dates Departure Arrival
1 01-01-2000 02-01-2000 03-01-2000
1 02-01-2000 02-01-2000 03-01-2000
1 03-01-2000 02-01-2000 03-01-2000
2 01-05-2000 01-05-2000 31-12-2020
2 02-05-2000 01-05-2000 31-12-2020
2 03-05-2000 01-05-2000 31-12-2020
我正在考虑使用 dplyr 中的 if else 和 group_by 的组合,但除此之外我陷入困境。任何建议将不胜感激!!
最佳答案
一个选项是在按“Group”分组后使用 replace_na
(来自 tidyr
)将 NA
元素替换为 “日期”列的第一个
或最后
值
library(dplyr)
library(tidyr)
df1 %>%
group_by(Group) %>%
mutate(Departure = replace_na(Departure, first(Dates)),
Arrival = replace_na(Arrival, last(Dates))) %>%
ungroup
注意:这里我们假设“日期”已被订购
。如果没有,则转换为Date
类后取min
和max
library(lubridate)
df1 %>%
mutate(across(-Group, dmy)) %>%
group_by(Group) %>%
mutate(Departure = replace_na(Departure, min(Dates)),
Arrival = replace_na(Arrival, max(Dates))) %>%
ungroup
关于用组内其他列的第一个或最后一个值替换数据帧中的 NA 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66393590/