Вернуть строки, которые содержат хотя бы один элемент, удовлетворяющий условию. Использование dplyr :: filter для нескольких столбцов. Отфильтровать и применить - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть этот набор данных:

dat <- structure(list(Date.1 = c(NA, NA, NA, 7, 7, 7, 7, 7, 7, 7, 7, 
7, 7, 7, 7), Date.2 = c(NA, NA, NA, 7, 7, 6, 6, 6, 6, 6, 6, 6, 
6, 6, 6), Date.3 = c(NA, NA, NA, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 
8, 8), Date.4 = c(NA, NA, NA, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
7), Date.5 = c(NA, NA, NA, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
), Date.6 = c(NA, NA, NA, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7), 
    Date.7 = c(NA, NA, NA, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
    ), Date.8 = c(NA, NA, NA, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
    7), Date.9 = c(NA, NA, NA, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 
    6, 6), Date.10 = c(NA, NA, NA, 6, 6, 8, 8, 8, 11, 8, 8, 8, 
    8, 8, 8), Date.11 = c(NA, NA, NA, 8, 8, NA, NA, NA, NA, NA, 
    7, 7, 7, 21, 7), Date.12 = c(NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_
    ), Date.13 = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_), Date.14 = c(NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_), Date.15 = c(NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_
    )), .Names = c("Date.1", "Date.2", "Date.3", "Date.4", "Date.5", 
"Date.6", "Date.7", "Date.8", "Date.9", "Date.10", "Date.11", 
"Date.12", "Date.13", "Date.14", "Date.15"), row.names = c(NA, 
15L), class = "data.frame")

Вид:

> dat
   Date.1 Date.2 Date.3 Date.4 Date.5 Date.6 Date.7 Date.8 Date.9 Date.10 Date.11 Date.12 Date.13 Date.14 Date.15
1      NA     NA     NA     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA      NA      NA
2      NA     NA     NA     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA      NA      NA
3      NA     NA     NA     NA     NA     NA     NA     NA     NA      NA      NA      NA      NA      NA      NA
4       7      7      6      8      7      7      7      7      7       6       8      NA      NA      NA      NA
5       7      7      6      8      7      7      7      7      7       6       8      NA      NA      NA      NA
6       7      6      8      7      7      7      7      7      6       8      NA      NA      NA      NA      NA
7       7      6      8      7      7      7      7      7      6       8      NA      NA      NA      NA      NA
8       7      6      8      7      7      7      7      7      6       8      NA      NA      NA      NA      NA
9       7      6      8      7      7      7      7      7      6      11      NA      NA      NA      NA      NA
10      7      6      8      7      7      7      7      7      6       8      NA      NA      NA      NA      NA
11      7      6      8      7      7      7      7      7      6       8       7      NA      NA      NA      NA
12      7      6      8      7      7      7      7      7      6       8       7      NA      NA      NA      NA
13      7      6      8      7      7      7      7      7      6       8       7      NA      NA      NA      NA
14      7      6      8      7      7      7      7      7      6       8      21      NA      NA      NA      NA
15      7      6      8      7      7      7      7      7      6       8       7      NA      NA      NA      NA

Я хочу проверить данные по строкам и извлечь только те строки, которые содержат хотя бы одну ячейку размером более 8 .

Следовательно, в приведенном выше примере следует сообщать строки 9 и 14, поскольку они обе содержат одну ячейку с номером больше 8.

Я пробовал много, много вариантов и ни один не работает .. Просто перечислим несколько из них:

dat %>% rowwise %>% dplyr::filter(. > 8)
dat %>% lapply(dplyr::filter, . > 8)
dat %>% dplyr::filter_at(vars(starts_with("Date)), any_vars(. > 8))
dat %>% lapply(function(x) dplyr::filter(x > 8))

И, похоже, в dplyr это вообще невозможно, если я правильно понимаю этот пост .

Делать все вручную было бы так:

test <- dat
test %>% filter(Date.1 > 8 )
test %>% filter(Date.2 > 8 )
test %>% filter(Date.3 > 8 )
test %>% filter(Date.4 > 8 )
test %>% filter(Date.5 > 8 )
test %>% filter(Date.6 > 8 )
test %>% filter(Date.7 > 8 )
test %>% filter(Date.8 > 8 )
test %>% filter(Date.9 > 8 )
test %>% filter(Date.10 > 8 )
test %>% filter(Date.11 > 8 )
test %>% filter(Date.12 > 8 )
test %>% filter(Date.13 > 8 )
test %>% filter(Date.14 > 8 )
test %>% filter(Date.15 > 8 )

Есть ли способ эффективно сделать это в base R или dplyr или любом другом package?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Вы также можете использовать функцию apply из базы R:

dat[apply(dat, 1, function(x) any(x>8, na.rm = TRUE)),]
0 голосов
/ 25 апреля 2018

Вы можете сделать это с помощью dplyr:

library(dplyr) 
filter_all(dat, any_vars(. > 8))

Ура! * * 1005

...