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

标签 r dplyr concatenation na collapse

使用 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/

相关文章:

r - ggplot2 示例中的两点运算符

r - 如何在 R 中对列表列表进行排序?

r - 如何优雅地跨越多个列进行 str_detect 并有条件地填充新列

r - 在适用于 R 的 Shiny 应用程序中,如何延迟响应式的触发?

php - 在字符串中包含常量而不连接

ElasticSearch - 字符串连接聚合?

r - 检查字符串是否包含向量中的所有元素? (R,数据帧,dplyr)

r - 如何在R中创建分布矩阵

r - 使用 case_when(grepl()) 对多个参数进行 transmute_at 指定的列号

c# - 使用 Path.Combine 比使用 '+' 连接字符串有什么优势?