【问题标题】:Merging columns while ignoring NAs在忽略 NA 的同时合并列
【发布时间】:2020-10-20 16:10:06
【问题描述】:

我想合并多个列。这是我的示例数据集的样子。

df <- data.frame(
  id = c(1,2,3,4,5),
  cat.1 = c(3,4,NA,4,2),
  cat.2 = c(3,NA,1,4,NA),
  cat.3 = c(3,4,1,4,2))

> df
  id cat.1 cat.2 cat.3
1  1     3     3     3
2  2     4    NA     4
3  3    NA     1     1
4  4     4     4     4
5  5     2    NA     2

我正在尝试合并列 cat.1 cat.2cat.3。对我来说有点复杂,因为有 NA。

我只需要一个cat 变量,甚至某些列有NA,我需要忽略它们。所需的输出如下:

> df
  id   cat 
1  1     3   
2  2     4  
3  3     1  
4  4     4 
5  5     2  

有什么想法吗?

【问题讨论】:

    标签: r dataframe merge


    【解决方案1】:

    Gregor 使用dplyr::transmute 的答案的另一个变体:

    library(dplyr)
    df %>% 
      transmute(id = id, cat = coalesce(cat.1, cat.2, cat.3))
    
     #>   id cat
     #> 1  1   3
     #> 2  2   4
     #> 3  3   1
     #> 4  4   4
     #> 5  5   2
    

    【讨论】:

    • @Gregor 我也是,总是必须输入 dplyr:: 并向下滚动以记住语法,哈哈。
    【解决方案2】:

    dplyr:

    library(dplyr)
    df %>%
      mutate(cat = coalesce(cat.1, cat.2, cat.3)) %>%
      select(-cat.1, -cat.2, -cat.3)
    

    【讨论】:

      【解决方案3】:

      fcoalesce 的选项来自data.table

      library(data.table)
      setDT(df)[, .(id, cat = do.call(fcoalesce,  .SD)), .SDcols = patterns('^cat')]
      

      -输出

      #    id cat
      #1:  1   3
      #2:  2   4
      #3:  3   1
      #4:  4   4
      #5:  5   2
      

      【讨论】:

        【解决方案4】:

        这行得通吗:

        > library(dplyr)
        > df %>% rowwise() %>% mutate(cat = mean(c(cat.1, cat.2, cat.3), na.rm = T)) %>% select(-(2:4))
        # A tibble: 5 x 2
        # Rowwise: 
             id   cat
          <dbl> <dbl>
        1     1     3
        2     2     4
        3     3     1
        4     4     4
        5     5     2
        

        由于跨行的值是唯一的,因此行的平均值将返回相同的唯一值,也可以使用最大值或最小值。

        【讨论】:

          【解决方案5】:

          这是一个使用 apply 的基本 R 解决方案:

          df$cat <- apply(df, 1, function(x) unique(x[!is.na(x)][-1]))
          

          【讨论】:

          • apply(df[-1], ... unique(x[!is.na(x)])) 可能更干净一些
          猜你喜欢
          • 2017-12-21
          • 1970-01-01
          • 2017-10-25
          • 1970-01-01
          • 1970-01-01
          • 2020-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多