【问题标题】:Subsetting rows containing string By Column Names - Grepl按列名对包含字符串的行进行子集 - Grepl
【发布时间】:2019-01-29 18:21:20
【问题描述】:

我有一个如下的数据框:

有超过 200 列,这只是一个示例。

Col1    Col2    Col2-A   Col3   Col3-A
   1       3        BA      0       BA
   2       5        BA      1       NA
   3       7        BA      0       JN
   5       9        KD      1       BA
   9      10        BA      4       NA

如何过滤/子集此数据集,以便根据包含 -A 的列,删除包含除 BANA 以外的任何内容的行。

最终预期输出:

Col1    Col2    Col2-A   Col3   Col3-A
   1       3        BA      0       BA
   2       5        BA      1       NA
   9      10        BA      4       NA

【问题讨论】:

    标签: r dplyr grepl


    【解决方案1】:

    这是一个非常简单的方法:

    cols = grepl("-A", names(dd))
    rows = rowSums(dd[, cols] == "BA" | is.na(dd[, cols])) == sum(cols)
    
    dd[rows, ]
    #   Col1 Col2 Col2-A Col3 Col3-A
    # 1    1    3     BA    0     BA
    # 2    2    5     BA    1   <NA>
    # 5    9   10     BA    4   <NA>               
    

    使用这些数据:

    dd = read.table(header = T, text = 'Col1    Col2    Col2-A   Col3   Col3-A
       1       3        BA      0       BA
       2       5        BA      1       NA
       3       7        BA      0       JN
       5       9        KD      1       BA
       9      10        BA      4       NA', check.names = F)
    

    【讨论】:

      【解决方案2】:

      使用dplyr,您可以:

      df %>%
       filter_at(vars(contains(".A")), all_vars(grepl("BA", .) | is.na(.)))
      
        Col1 Col2 Col2.A Col3 Col3.A
      1    1    3     BA    0     BA
      2    2    5     BA    1   <NA>
      3    9   10     BA    4   <NA>
      

      它根据包含“.A”的变量进行过滤,并保留所有变量为“BA”或 NA 的行。

      或基于@Gregor 的帖子的简化版本:

      df %>%
       filter_at(vars(contains(".A")), all_vars(. == "BA" | is.na(.)))
      

      样本数据:

      df <- read.table(text = "Col1    Col2    Col2-A   Col3   Col3-A
         1       3        BA      0       BA
         2       5        BA      1       NA
         3       7        BA      0       JN
         5       9        KD      1       BA
         9      10        BA      4       NA", header = TRUE, stringsAsFactors = FALSE)
      

      【讨论】:

        猜你喜欢
        • 2021-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-30
        • 2014-04-15
        • 2020-12-28
        • 2017-08-11
        • 2021-08-12
        相关资源
        最近更新 更多