#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