[英]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.