【问题标题】:How to filter for a combination of list arguments and multiple character strings in dplyr如何在 dplyr 中过滤列表参数和多个字符串的组合
【发布时间】:2020-08-15 22:54:56
【问题描述】:

给定一个数据框:

v1_attr1 <- c(1,0,0,0,1,0,0,0,1,1) %>% as.integer ()
v1_attr2 <- c(0,1,0,0,1,1,1,1,1,1) %>% as.integer ()
v2_attr1 <- c(0,0,1,0,0,1,1,1,0,0)  %>% as.integer ()
v2_attr2 <- c(0,0,0,1,0,1,1,1,0,0)  %>% as.integer ()

df <- data.frame (v1_attr1, v1_attr2, v2_attr1, v2_attr2)

如何为每个v[[x]]attr 设置过滤器?

我尝试了以下代码来获取每个data.frame 中由attr 过滤的行数。

library(dplyr)

# create list for vs
list_vs <- list ("v1", "v2")

# set multiple attr filter for each v[[x]] to get the respective number of rows in each filtered data.frame (presented in a list)
filtered <- lapply (list_vs, function (x){
  df %>% filter (noquote(paste0(list_vs[[x]], "_attr1")) == 1 | noquote(paste0(list_vs[[x]], "_attr2")) == 1) %>%
  nrow ()
})

虽然此代码没有返回错误,但filtered[[x]] 的结果始终为 0。如何正确设置过滤器参数以在每个 data.frame 中获得所需的行数?我使用了noquote,因为否则过滤参数将被粘贴在引号中。

【问题讨论】:

    标签: r functional-programming


    【解决方案1】:

    一个选项是通过自动从列名中提取模式,将pivot_longer 转换为“长”格式,然后执行group_byfilter_at

    library(dplyr)
    library(tidyr)
    df %>%
       pivot_longer(cols = everything(), names_sep = "_", 
              names_to = c('group', '.value' )) %>%
       group_by(group) %>% 
       filter_at(vars(-group_cols()), any_vars(. == 1))
    

    【讨论】:

      【解决方案2】:

      dplyrpurrr 选项可以是:

      map(.x = list_vs,
          ~ df %>%
           filter_at(vars(starts_with(.x)), any_vars(. == 1)))
      
      [[1]]
        v1_attr1 v1_attr2 v2_attr1 v2_attr2
      1        1        0        0        0
      2        0        1        0        0
      3        1        1        0        0
      4        0        1        1        1
      5        0        1        1        1
      6        0        1        1        1
      7        1        1        0        0
      8        1        1        0        0
      
      [[2]]
        v1_attr1 v1_attr2 v2_attr1 v2_attr2
      1        0        0        1        0
      2        0        0        0        1
      3        0        1        1        1
      4        0        1        1        1
      5        0        1        1        1
      

      【讨论】:

      • 这是一个简洁明了的解决方案。谢谢!
      猜你喜欢
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      相关资源
      最近更新 更多