r - 连接 R 中的列,但仅在值存在时保留分隔符

标签 r dataframe concatenation paste separator

有谁知道 R 中连接 n 列但仅在该行中有值时才保留分隔符的方法?如果您运行以下示例:

df <- data.frame(
                  name1 = c("Jim","Bob","Sue"),
                  name2 = c("Jane","","Bane"),
                  name3 = c('Conor',"",""),
                  name4 = c("","","Bonor")
                )

df$names <- paste(df$name1,df$name2,df$name3, sep=";")

即使单元格为空,您也会看到分隔符包含在末尾和中间值中,输出为:

df =

name1 name2 name3 name4  names
Jim   Jane  Conor        Jim;Jane;Conor;
Bob                      Bob;;;
Sue   Bane        Bonor  Sue;Bane;;Bonor

在单元格为空的情况下,是否有任何方法可以不包含或删除分隔符?获得预期的结果:

df =

name1 name2 name3 name4  names
Jim   Jane  Conor        Jim;Jane;Conor
Bob                      Bob
Sue   Bane        Bonor  Sue;Bane;Bonor

最佳答案

library(dplyr)
library(tidyr)

df %>% 
  mutate_all(na_if,"") %>% 
  unite("names", everything(), sep = ";", remove = F, na.rm = T)

#>            names name1 name2 name3 name4
#> 1 Jim;Jane;Conor   Jim  Jane Conor  <NA>
#> 2            Bob   Bob  <NA>  <NA>  <NA>
#> 3 Sue;Bane;Bonor   Sue  Bane  <NA> Bonor

更新:将此解决方案应用于特定列。

我正在根据下面的评论修改 akrun 的回答;

df %>% 
  mutate(across(c("name1", "name2", "name3", "name4"), na_if, "", 
                .names = "{.col}_changed")) %>% 
  unite(names, ends_with('_changed'), na.rm = TRUE, sep = ";")

#>   name1 name2 name3 name4          names
#> 1   Jim  Jane Conor       Jim;Jane;Conor
#> 2   Bob                              Bob
#> 3   Sue  Bane       Bonor Sue;Bane;Bonor

关于r - 连接 R 中的列,但仅在值存在时保留分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71771766/

相关文章:

R rlm 模型错误 : 'x' is singular: singular fits are not implemented in 'rlm'

r - for循环中的变量赋值

html - 使用 slidify Reveal.js 删除图像边框

python - dask dataframe 删除重复的索引值

xml - 将 xml 解析为 R 数据框时出现问题?

r - 通过匹配列和值 R 对数据帧进行子集和分组

python - 删除重复项并添加值 Pandas

python - 在 matlab 和 python 中创建迭代数组

mysql - 在查询中使用 LEFT JOIN 或 GROUP BY 时,CONCAT() 结果意外截断

php - 使用变量和字符串连接作为表名的 PDO 查询