【问题标题】:Store and apply dplyr filters from vector in R在 R 中存储和应用向量中的 dplyr 过滤器
【发布时间】:2021-11-15 22:37:17
【问题描述】:

我有一个加载到 R 中的数据集,并在其上定义了 8 个 dplyr 过滤器。我想详尽地将两个过滤器的所有组合应用于数据集,以检查结果组的大小。目前,我将这些过滤器存储到如下变量中:

  filter1 <- data %>% filter(var1 == x)
  filter2 <- data %>% filter(var2 == y)
  ...
  filter8 <- data %>% filter(varn == z)

现在我会将这些过滤器存储在一个向量中,这样我就可以在 for 循环中调用应用它们并执行以下操作:

  filter_vec <- c(filter1, filter2, ..., filter8)

  for (i in filter_vec){
     for (j in filter_vec)
        filter_insection <- dplyr::intersect(i,j)
        print(nrow(filter_intersection)
     }
  }

但是,这不起作用。结果总是一个长度为 0 的列表对象,表示所有的交集都是空的,而实际上它们不是。

我已经尝试了很多方法来让代码正常工作。首先,我没有使用过滤器,而是尝试从函数中获取过滤功能(如这篇文章中所建议的:Can we combine 2 filters in R?)并改为使用函数向量。在这里我遇到了基本相同的问题(包括“无效的下标类型'list'错误)

此外,我尝试:1) 使用“expr”变量,2) 使用 rlang 解析表达式和 3) 在将它们插入 dplyr 函数之前通过“unlist”从向量传递项目。然而,似乎没有人能做到这一点。因此,我想知道如何从 R 中的向量存储和应用 dplyr 过滤器?

【问题讨论】:

    标签: r list dataframe dplyr filtering


    【解决方案1】:

    将数据帧存储在列表中,稍后按以下方式使用for 循环。

    filter_vec <- list(filter1, filter2, ..., filter8)
    output <- vector('list', length(filter_vec) * length(filter_vec))
    k <- 0
    
    for (i in filter_vec){
      for (j in filter_vec){
        k <- k + 1
        output[[k]] <- dplyr::intersect(i,j)
        print(nrow(output[[k]]))
      }
    }
    
    output
    

    【讨论】:

    • 感谢@Ronak Shak 解决了这个问题!你能解释一下为什么我的方法不起作用吗?
    • 我认为主要原因是使用c 来创建filter_vec。检查c(head(mtcars), head(mtcars))list(head(mtcars), head(mtcars)) 的输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2016-06-28
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多