gpt4 book ai didi

r - 使用 dplyr、group_by 和 mutate() 或汇总 () & str_c() 或 paste() & 折叠连接字符串/行,但保持 NA 和所有字符串

转载 作者:行者123 更新时间:2023-12-04 12:30:40 25 4
gpt4 key购买 nike

使用 dplyr 连接字符串时, group_by()mutate()summarize ()paste()collapse , NA值被强制为字符串 "NA" .
使用时 str_c()而不是 paste() , 与 NA 连接的字符串被删除( ?str_c :每当缺失值与另一个字符串组合时,结果将始终缺失)。当有这样的组合 NA &非NA值,如何删除 NA而不是非 NA在串联?
请参阅下面的示例:

library(dplyr)
library(stringr)
ID <- c(1,1,2,2,3,4)
string <- c(' asfdas ', 'sdf', NA,'sadf', 'NA', NA)
df <- data.frame(ID, string)
# ID string
# 1 1 asfdas
# 2 1 sdf
# 3 2 <NA> # ID 2 has both NA and non-NA values
# 4 2 sadf #
# 5 3 NA
# 6 4 <NA>
两个都,
df%>%
group_by(ID)%>%
summarize(string = paste(string, collapse = "; "))%>%
distinct_all()
df_conca <-df%>%
group_by(ID)%>%
dplyr::mutate(string = paste(string, collapse = "; "))%>%
distinct_all()
导致
     ID string               
1 1 " asfdas ; sdf"
2 2 "NA; sadf"
3 3 "NA"
4 4 "NA" # NA coerced to "NA"
IE。 NA变成“NA”:
尽管
df %>%
group_by(ID)%>%
summarize(string = str_c(string, collapse = "; "))
结果是:
     ID string               
1 1 " asfdas ; sdf"
2 2 NA
3 3 "NA"
4 4 NA
IE。根据 str_c 删除“sadf”规则: NA与字符串结合,结果 NA .
但是,我想保持真实 NA值(例如 'ID' 4)和仅字符串(例如 'ID' 2),例如:
     ID string             
1 1 " asfdas ; sdf"
2 2 "sadf"
3 3 "NA"
4 4 NA
理想情况下,我想留在 dplyr工作流程。

这个问题是 Concatenating strings / rows using dplyr, group_by & collapse or summarize, but maintain NA values的扩展

最佳答案

使用 pivot_widerunite

library(dplyr)
library(tidyr)
library(data.table)
df %>%
mutate(rn = rowid(ID)) %>%
pivot_wider(names_from = rn, values_from = string) %>%
unite(string, `1`, `2`, na.rm = TRUE, sep = " ; ")%>%
mutate(string = na_if(string, ""))
-输出
# A tibble: 4 x 2
ID string
<dbl> <chr>
1 1 " asfdas ; sdf"
2 2 "sadf"
3 3 "NA"
4 4 <NA>

或者也可以使用 coalesce
df %>%
group_by(ID) %>%
summarise(string = na_if(coalesce(str_c(string, collapse = " ; "),
str_c(string[complete.cases(string)], collapse = " ; ")), ""))
-输出
# A tibble: 4 x 2
ID string
<dbl> <chr>
1 1 " asfdas ; sdf"
2 2 "sadf"
3 3 "NA"
4 4 <NA>

关于r - 使用 dplyr、group_by 和 mutate() 或汇总 () & str_c() 或 paste() & 折叠连接字符串/行,但保持 NA 和所有字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69303052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com