用组内其他列的第一个或最后一个值替换数据帧中的 NA 值

标签 r dataframe replace na

我有以下数据框:

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类后取minmax

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/

相关文章:

r - 从 R 中数据框中的单元格中提取数字字符

python - 计算重复行并填充列

php - 使用 PHP 替换大文件中的字符

javascript - 删除评论 anchor # 和所有内容?搜索但离开?和其余的

sql-server - 仅使用替换作为预防的 SQL Server 的 SQL 注入(inject)问题的真实示例?

r - OSM 编码问题

r - 文本层在 ggplot 中工作,但用 ggplotly 删除

r - 当外部程序通过 R 的 C API 接口(interface)调用 `Rf_allocXXX` 时,谁在管理内存?

python - 如何修复 Python Pandas 中的 "The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()"?

r - 如何 "round"ggplot中的范围线