Filtro de dplyr (com qualquer uma das linhas)
Sou novo no mundo R, atualmente tenho problemas com a função de filtro do dplyr. Tenho um df e um preciso filtrar os valores maiores que um número, mas em algumas linhas tenho valores múltiplos (separados por; ) Por exemplo, eu tenho 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
Meu filtro é se um ou mais em valor1 for maior ou igual a 3. Eu uso a função filtro de dplyr porque preciso realizar outros filtros para o df. Este é o meu código.
filt <- df %>% filter(any(as.numeric(unlist(strsplit(value1,';',fixed=TRUE))) >=3))
Mas neste caso a função any considera todos os valores do df (não por linha, como eu pensava), então obtenho todos os df e isso não está correto.
Preciso obter a linha com id 1,2 e 4 para este exemplo.
Acho que devo verificar por linha e separar por; , mas não sei como fazer isso com a função de filtro do dplyr.
Muito obrigado!
Respostas
Uma opção seria dividir o 'valor1' com separate_rows
de tidyr
, agrupado por 'ID', filter
grupos com any
elemento em 'valor1' maior ou igual a 3, então summarise
as colunas por paste
ing e obtendo o 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
Ou usando map
comstrsplit
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
dados
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))