Filtro de dplyr (con cualquiera de las filas)
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
Una opción sería dividir el 'valor1' con separate_rows
de tidyr
, agrupados por 'ID', filter
grupos que tengan un any
elemento en 'valor1' mayor o igual a 3, luego summarise
las columnas por paste
ing y obteniendo el first
elemento 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 map
constrsplit
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))