Filtro de dplyr (con cualquiera de las filas)

Aug 18 2020

Soy nuevo en el mundo R, estos días tengo un problema con la función de filtro de dplyr, tengo un df y un necesito filtrar los valores mayores que un número, pero en algunas filas tengo múltiples valores (separados por; ). Por ejemplo, tengo este 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

Mi filtro es si uno o más en value1 es mayor o igual que 3. Utilizo el filtro de función de dplyr porque necesito realizar otros filtros al df. Este es mi codigo.

filt <- df %>% filter(any(as.numeric(unlist(strsplit(value1,';',fixed=TRUE))) >=3))

Pero en este caso, la función any considera todos los valores de df (no por fila, como pensaba), así que obtenemos todos los gl y eso no es correcto.

Necesito obtener una fila con id 1,2 y 4 para este ejemplo.

Creo que debería marcar por fila y separar por; , pero no sé cómo hacer esto con la función de filtro de dplyr.

¡Muchas gracias!

Respuestas

1 akrun Aug 18 2020 at 02:00

Una opción sería dividir el 'valor1' con separate_rowsde tidyr, agrupados por 'ID', filtergrupos que tengan un anyelemento en 'valor1' mayor o igual a 3, luego summariselas columnas por pasteing y obteniendo el firstelemento de 'valor2'

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

O usar mapconstrsplit

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

datos

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))