Filtro de dplyr (com qualquer uma das linhas)

Aug 18 2020

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

1 akrun Aug 18 2020 at 02:00

Uma opção seria dividir o 'valor1' com separate_rowsde tidyr, agrupado por 'ID', filtergrupos com anyelemento em 'valor1' maior ou igual a 3, então summariseas colunas por pasteing e obtendo o 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

Ou usando mapcomstrsplit

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