【问题标题】:Combine Columns with Similar Column Names / Similar Column Strings - Reprex合并具有相似列名/相似列字符串的列 - Reprex
【发布时间】:2020-07-24 20:50:49
【问题描述】:

目标:仅根据列名的相似性合并多个列。

问题:我正在处理一个大型数据集,其中列名被复制,看起来像这样:wk1.1、wk1.2、wk1.3。对于每一行,相似的列名中只有一个值,其他的都是 NA。 Coalesce 非常有用,但是当我必须列出每个列名时变得乏味(搞乱自动化)。有没有办法根据一串字符进行合并?例如下面,我希望合并 %in% "wk1"。

library(dplyr)
wk1.1 <- c(15, 4, 1)
wk1.2 <- c(3, 20, 4)
wk1.3 <- c(1, 2, 17)

df <- data.frame(wk1.1, wk1.2, wk1.3)
df[df < 14] <- NA
df1 <- df %>%
  mutate(wk1 = coalesce(df$wk1.1, df$wk1.2, df$wk1.3))

【问题讨论】:

    标签: r dplyr coalesce data-wrangling


    【解决方案1】:

    我们可以用!!!拼接它

    library(dplyr)
    df %>%
          mutate(wk1 = coalesce(!!! .))
    #  wk1.1 wk1.2 wk1.3 wk1
    #1    15    NA    NA  15
    #2    NA    20    NA  20
    #3    NA    NA    17  17
    

    或者另一种选择是reduce 并申请coalesce

    library(purrr)
    df %>%
       mutate(wk1 = reduce(., coalesce))
    

    【讨论】:

    • @DonnyDolio 谢谢,我能想到 NA"NA" 因而不匹配??能否请您使用dput 显示一个小示例,以便我了解数据的结构
    • @DonnyDolio 谢谢。它实际上对我有用。我用dplyr 1.0.0df %&gt;% mutate(wk1 = coalesce(!!! .)) %&gt;% pull(wk1)# [1] NA "W 56-35" "L 20-45" "L 31-34" "W 42-41" "W 41-38"。第一个是 NA,因为该行中的所有值都是 NA
    • 太棒了,谢谢!总是感谢您的帮助@akrun。我想我遇到了问题,因为我使用了网络抓取并且没有清理数据。我得到“参数必须是因子对象,而不是字符向量。”我将清理数据,看看这是否能解决问题。感谢您分享有关如何组合相似列名的知识!
    • @DonnyDolio 在这种情况下,您可以将列更改为characterdf %&gt;% mutate(across(where(is.factor), as.character), wk1 = coalesce(!!! .))
    • 这成功了!感谢您对@akrun 的深入了解。只是提醒您使用 dplyr 可以完成的所有繁重工作
    猜你喜欢
    • 2020-10-25
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多