Есть ли способ объединить результаты dplyr :: filter_at? (фильтрация многих переменных одновременно) - PullRequest
1 голос
/ 09 февраля 2020

У меня есть следующий фрейм данных:

  A B C D
1 1 2 3 T
2 1 5 5 F
3 1 1 1 T
4 5 5 5 T
5 5 5 5 T

Я пытаюсь удалить строки, содержащие все одно и то же число (например, все 5 с, все 1 с) для переменных A до C (в моих реальных данных у меня есть еще много переменных между A и C). Я могу отфильтровать строки по всем 5, выполнив следующее:

library(dplyr)

A <- c(1, 1, 1, 5, 5)
B <- c(2, 5, 1, 5, 5)
C <- c(3, 5, 1, 5, 5)
D <- c(2, 2, 2, 2, 2)

df <- data.frame(A, B, C, D)

df %>%
  filter_at(.vars = 1:3, .vars_predicate = all_vars(. == 5))


  A B C D
1 5 5 5 T
2 5 5 5 T

Есть ли способ связать еще один filter_at(), чтобы я мог сделать то же самое для строк со всеми 1? Идеальный результат будет выглядеть так:

  A B C D
1 5 5 5 T
2 5 5 5 T
3 1 1 1 T

Я пытался использовать логические операторы в all_vars(), но он не дает правильного результата. В приведенном ниже кадре данных мы получаем строки, которые содержат как 5, так и 1 с.

df %>%
  filter_at(.vars = 1:3, .vars_predicate = all_vars(. == 5 | . == 1))

  A B C D
1 1 5 5 F
2 1 1 1 T
3 5 5 5 T
4 5 5 5 T

Опять же, я стараюсь избегать ручной фильтрации каждой переменной (например, filter(A == 1 & B == 1 ... )), потому что у меня много десятков другие столбцы.

Любые альтернативные подходы или предложения пакетов приветствуются.

Ответы [ 2 ]

1 голос
/ 09 февраля 2020

Вам нужна функция, которая может оценивать значения по строкам. Есть несколько вариантов, но один вариант:

library(dplyr)

df %>%
  filter_at(1:3, ~ .x %in% c(1,5) & do.call(pmin, df[1:3]) == do.call(pmax, df[1:3])) 

  A B C D
1 1 1 1 2
2 5 5 5 2
3 5 5 5 2 
1 голос
/ 09 февраля 2020

Программирование в старом стиле R с использованием логического индексирования в i -позиции с [:

df[ apply( df[1:3], 1, function(x){sum(x==5)==3 || sum(x==1)==3}), ]
  A B C D
3 1 1 1 2
4 5 5 5 2
5 5 5 5 2

df[apply( df[1:3], 1, function(x){all(x==5) || all(x==1)}), ]
  A B C D
3 1 1 1 2
4 5 5 5 2
5 5 5 5 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...