Фильтр дплеров (с любой из строк)
Я новичок в мире R, сейчас у меня проблема с функцией фильтрации dply. У меня есть df и a. Мне нужно отфильтровать значения, превышающие число, но в некоторых строках у меня есть кратные значения (разделенные; ). Например у меня это df
ID value1 value2
1 1;0;3.4 4
2 3 5
3 0.5;2;1.3 0
4 5;0.1 3
Мой фильтр - если одно или несколько в value1 больше или равно 3. Я использую функциональный фильтр dplyr, потому что мне нужно реализовать другие фильтры для df. Это мой код.
filt <- df %>% filter(any(as.numeric(unlist(strsplit(value1,';',fixed=TRUE))) >=3))
Но в этом случае функция any рассматривает все значения df (а не по строкам, как я думал), поэтому я получаю все df, и это неверно.
Для этого примера мне нужно получить строку с идентификаторами 1,2 и 4.
Я думаю, мне следует проверять по строкам и разделять по; , но я не знаю, как это сделать с помощью функции фильтрации dplyr.
Спасибо!
Ответы
Вариант состоит в том, чтобы разделить «значение1» на группы separate_rows
из tidyr
, сгруппированные по «ID», filter
имеющие any
элемент в «значении1» больше или равное 3, а затем summarise
столбцы с помощью paste
ing и получения first
элемента «значение2».
library(dplyr)
library(tidyr)
df %>%
separate_rows(value1, sep = ";", convert = TRUE) %>%
group_by(ID) %>%
filter(any(value1 >=3)) %>%
summarise(value1 = str_c(value1, collapse=";"), value2 = first(value2))
# A tibble: 3 x 3
# ID value1 value2
# <int> <chr> <int>
#1 1 1;0;3.4 4
#2 2 3 5
#3 4 5;0.1 3
Или используя map
сstrsplit
library(purrr)
df %>%
filter(map_lgl(strsplit(value1, ";"), ~ any(as.numeric(.x) >=3)))
# ID value1 value2
#1 1 1;0;3.4 4
#2 2 3 5
#3 4 5;0.1 3
данные
df <- structure(list(ID = 1:4, value1 = c("1;0;3.4", "3", "0.5;2;1.3",
"5;0.1"), value2 = c(4L, 5L, 0L, 3L)), class = "data.frame", row.names = c(NA,
-4L))