繁体   English   中英

R 通过删除 NA 值聚合字符串

[英]R aggregate strings by dropping NA values

我有一个这样的DF:

df_1 <- data_frame(
  id = c(1, 1, 2, 2, 3),
  Class1 = c("C1", NA, "C3", "C3", NA),
  Class2 = c(NA, "C2", NA, NA, "C4")
)
> df_1
# A tibble: 5 x 3
     id Class1 Class2
  <dbl> <chr>  <chr> 
1     1 C1     NA    
2     1 NA     C2    
3     2 C3     NA    
4     2 C3     NA    
5     3 NA     C4 

我需要一个最终的 output:

> df_1
# A tibble: 5 x 3
     id Class1 Class2
  <dbl> <chr>  <chr> 
1     1 C1     C2    
2     2 C3     NA    
3     3 NA     C4 

我正在尝试分组和总结:

df_1 %>% group_by(id) %>% summarise_at(vars(Class1, Class2), ~ unique(.))
# A tibble: 4 x 3
# Groups:   id [3]
     id Class1 Class2
  <dbl> <chr>  <chr> 
1     1 C1     NA    
2     1 NA     C2    
3     2 C3     NA    
4     3 NA     C4  

如果任一列具有nonNA值,我如何删除NA值? 我找不到任何处理字符列的示例。

dplyr::coalesce完成这项工作:

df_1 %>%
  group_by(id) %>%
  summarise_at(vars(Class1, Class2), function(x) coalesce(!!!x))

# A tibble: 3 x 3
     id Class1 Class2
  <dbl> <chr>  <chr> 
1     1 C1     C2    
2     2 C3     NA    
3     3 NA     C4 

另一种解决方案。 分组填补空白并删除重复项。

df %>% 
  group_by(id) %>% 
  fill(everything(), .direction = "updown") %>% 
  distinct()

您可以获得Class列的第一个非 NA 值。

library(dplyr)

df_1 %>%
 group_by(id) %>%
 summarise(across(starts_with('Class'), ~na.omit(.)[1]))
 #In older dplyr use summarise_at
 #summarise_at(vars(starts_with('Class')), ~na.omit(.)[1])

# A tibble: 3 x 3
#     id Class1 Class2
#  <dbl> <chr>  <chr> 
#1     1 C1     C2    
#2     2 C3     NA    
#3     3 NA     C4    

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM