Filter_all(any_vars()) Где я ошибаюсь?

#r #dplyr

Вопрос:

У меня есть фрейм данных с 51 объектом из 20 переменных, которые называются . test Как показано ниже:

 X1 P1 P2 P3
A  1  0  5
B  3  9  0
C  5  0  0
D  1  0  0
 

Я хочу удалить все строки, в которых значения меньше или равны 1. Таким образом,результирующий фрейм данных будет содержать только строки A,B, C.
Я думал, что взломал его, используя следующую команду:

 test2 <- test %>% filter_all(any_vars(. > 2))
 

Я тоже пытался

 test2 <- test %>% select(X1, P1:P3) %>% filter_all(any_vars(. > 2). 
 

Это не удаляет ни одну из строк, хотя я вижу, что строки имеют значения меньше или равны 1.

Любая помощь будет признательна

Ответ №1:

Вы можете использовать следующее решение:

 library(dplyr)

df %>%
  filter(if_all(everything(), ~ .x > 1))
 

С измененным набором данных он возвращает:

   X1 P1 P2 P3
1  B  3  9  2
 

Данные

 structure(list(X1 = c("A", "B", "C", "D"), P1 = c(1L, 3L, 5L, 
1L), P2 = c(0L, 9L, 0L, 0L), P3 = c(5L, 2L, 0L, 0L)), class = "data.frame", row.names = c(NA, 
-4L))
 

Вот еще один способ сделать это с purrr::pmap :

  • pmap используется для операций по строкам, здесь мы фиксируем каждую строку нашего набора данных на каждой итерации c(...) , исключая первую переменную X1
  • Затем я проверяю, все ли они больше, чем 1
 df %>%
  filter(pmap_lgl(df[-1], ~ all(c(...) > 1)))

  X1 P1 P2 P3
1  B  3  9  2
 

Комментарии:

1. Спасибо за комментарий. Он не может найти «if_all», хотя у меня есть «dplyr»

2. Я думаю, вам следует обновить свой пакет, так if_all как и if_any включены относительно новые функции dplyr .

3. Хорошее использование if_all и отличное объяснение, как оно есть all , тогда across бы тоже сработало

4. Большое вам спасибо, это очень любезно с вашей стороны. Никогда не использовался across в этой ситуации, вы можете добавить его, чтобы мы тоже это узнали.

Ответ №2:

В базе R вы можете воспользоваться помощью rowSums

 res <- test[rowSums(test[-1] > 2) > 0, ]
res

#  X1 P1 P2 P3
#1  A  1  0  5
#2  B  3  9  2
#3  C  5  0  0