用同一列中的串联值替换每组的 NA 值

Replace NA values per group with concatenated values from the same column

我希望实现以下目标:

对于每个Group,当ID列为NA时,则将Name中的相应NA值填入Name中的其他值同时忽略 Name

中的其他 NA 值

我的数据框如下所示:

x <- data.frame(Group = c("A","A","A","A","B","B"),ID = c(1,2,3,NA,NA,5),Name = c("Bob","Jane",NA,NA,NA,"Tim"))

这是我希望达到的目标:

y <- data.frame(Group = c("A","A","A","A","B","B"),ID = c(1,2,3,NA,NA,5),Name = c("Bob","Jane",NA,"Bob Jane","Tim","Tim"))

如果有办法在 tidyverse 中实现这一点,我将不胜感激任何指点。

我尝试了以下方法,但没有找到对象 'Name'

 x %>% group_by(Group) %>% replace_na(list(Name = paste(unique(.Name))))

我们可以使用条件表达式 replace

library(dplyr)
library(stringr)
x %>% 
   group_by(Group) %>%
   mutate(Name = replace(Name, is.na(ID), str_c(Name[!is.na(Name)], 
          collapse = ' '))) %>%
   ungroup

-输出

# A tibble: 6 × 3
  Group    ID Name    
  <chr> <dbl> <chr>   
1 A         1 Bob     
2 A         2 Jane    
3 A         3 <NA>    
4 A        NA Bob Jane
5 B        NA Tim     
6 B         5 Tim     

这个有用吗:

library(dplyr)
x %>% group_by(Group) %>% 
   mutate(Name = case_when(is.na(ID) ~ paste(Name[!is.na(Name)], collapse = ' '), TRUE ~ Name))

# A tibble: 6 x 3
# Groups:   Group [2]
  Group    ID Name    
  <chr> <dbl> <chr>   
1 A         1 Bob     
2 A         2 Jane    
3 A         3 NA      
4 A        NA Bob Jane
5 B        NA Tim     
6 B         5 Tim