【问题标题】:Filtering multiple columns via a list using %in% and filter in R使用 %in% 通过列表过滤多个列并在 R 中过滤
【发布时间】:2018-07-08 07:06:44
【问题描述】:

好的,这是我想象中的data.frame,称为data

A1 A2 A3  A4  A5  A6     
1  2  45  35  33  38  
5  1  23  33  58  47
18 26 78  15  5   6

我想要做的是选择所有列中包含 1 或 33 的所有行

所以我最初的想法是写下面的代码

a <- paste0("A",1:6)
num <- c("1","33")

data <- data %>%
  filter(a %in% num)

直觉上我虽然这会起作用,但我不断收到错误结果必须有长度_而不是_

我有什么办法可以解决这个问题或使用不同的解决方案?谢谢!

【问题讨论】:

    标签: r dataframe filter dplyr


    【解决方案1】:

    这个简单的基础 R 怎么样:

    data[rowSums(data==33 | data==1)>=1,]
    
    #  A1 A2 A3 A4 A5 A6
    #1  1  2 45 35 33 38
    #2  5  1 23 33 58 47
    

    如果你想扩展你的过滤器

    filter <- c(1,33)
    data[rowSums(matrix(as.matrix(data) %in% filter, nrow(data), ncol(data)))>=1,]
    

    【讨论】:

      【解决方案2】:

      回到基础 R:

      df[apply(df, 1, function(x) any(x %in% c(1, 33))), ]
        A1 A2 A3 A4 A5 A6
      1  1  2 45 35 33 38
      2  5  1 23 33 58 47
      

      【讨论】:

      • 另一个base R 选项是data[Reduce('|', lapply(data, '%in%', c(1, 33))), ]
      【解决方案3】:

      我们可以通过filter_all 做到这一点

      library(dplyr)
      data %>% 
          filter_all(any_vars(. %in% c(1, 33)))
      #  A1 A2 A3 A4 A5 A6
      #1  1  2 45 35 33 38
      #2  5  1 23 33 58 47
      

      如果我们需要对列的子集执行此操作,请使用 filter_at 并在 vars 中指定列索引或名称

      data %>%
         filter_at(vars(matches("A\\d+")), any_vars(. %in% c(1, 33)))
      

      vars也可以带对象

      a <- paste0("A", 1:6)
      vals <- c(1, 33)
      data %>% 
          filter_at(vars(a), any_vars(. %in%  vals))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-25
        • 2023-03-23
        • 2018-06-17
        • 1970-01-01
        • 1970-01-01
        • 2020-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多