Фильтр дплеров (с любой из строк)

Aug 18 2020

Я новичок в мире 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 akrun Aug 18 2020 at 02:00

Вариант состоит в том, чтобы разделить «значение1» на группы separate_rowsиз tidyr, сгруппированные по «ID», filterимеющие anyэлемент в «значении1» больше или равное 3, а затем summariseстолбцы с помощью pasteing и получения 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))