База фильтра по нескольким условиям и переменным - PullRequest
1 голос
/ 12 октября 2019

Я работаю с данными опроса, и мне нужно отфильтровать по множеству переменных ответа, 543, если быть точным.

Будучи моими данными вот так:

Q1 <- c(1,0,1,1)
Q2 <- c(0,1,0,0)
Q3 <- c(1,1,1,0)
Q4 <- c(0,0,0,0)
Q5 <- c(1,0,0,0)
DT <- data.frame(Q1,Q2,Q3,Q4,Q5)

Я хочу знать, сколько людей ответили хотя бы на один из этих вопросов, поэтому код, использующий пакет dplyr, должен быть:

MR <- DT %>%
   filter(Q1 == 1 | Q2 == 1 | Q3 == 1 | Q4 == 1 | Q5 == 1 )

nrow(MR)

В принципе, я стараюсь избегать написания обширного кода от переменной 1 до переменной543;как это:

library(dplyr)
MR <- DT %>%
   filter(Q1 == 1 | Q2 == 1 | Q3 == 1 | Q4 == 1 | Q5 == 1 | ... | Q543 == 1)

Есть ли более эффективный способ фильтрации по стольким переменным?

Ответы [ 2 ]

3 голосов
/ 12 октября 2019

Есть несколько способов сделать это. Один из вариантов - filter_at, где мы указываем переменные, которые должны быть выбраны, с одним из select_helpers (matches - имена столбцов, которые начинаются (^) с "Q", за которым следуют одна или несколько цифр (\\d+)) до конца ($) строки и с помощью any_vars создайте логику, в которой строки, имеющие хотя бы одно значение в столбце, равны 1

library(dplyr)
DT %>%
   filter_at(vars(matches("^Q\\d+$")), any_vars(.==1))

Или используя map и reduce. Мы перебираем select ed столбцы с помощью map, создаем логические vector и reduce это в один логический vector с |. Это можетиспользоваться в filter для фильтрации строк

library(purrr)
DT %>%
   filter(map(select(., matches("^Q\\d+$")), `==`, 1) %>% 
             reduce(`|`))

или другой способ rowSums

DT %>%
   filter(rowSums(select(., matches("^Q\\d+$")) ==1) > 0)
1 голос
/ 13 октября 2019

Base R один вкладыш:

DT[c(sort(unique(unlist(lapply(DT, function(x){which(x==1)}))))),]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...