Как отфильтровать комбинацию аргументов списка и строк из нескольких символов в dplyr - PullRequest
3 голосов
/ 01 мая 2020

Учитывая данные кадра:

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)

Как я могу установить фильтр для attr каждого v[[x]]?

Я попробовал следующий код, чтобы получить количество строк в каждом 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, потому что иначе аргументы фильтрации будут вставлены в кавычки.

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Один dplyr и purrr параметр может быть:

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
1 голос
/ 01 мая 2020

Можно преобразовать в 'длинный' формат с pivot_longer, автоматически выбирая шаблоны из имен столбцов, а затем выполнить group_by, filter_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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...