1
votes

Comment filtrer les lignes qui contiennent une chaîne dans n'importe quelle colonne d'un dataframe

En utilisant le dataframe mtcars , comment puis-je obtenir un nouveau dataframe contenant la chaîne "3"

Jusqu'à présent, j'ai:

mtcars<-lapply(mtcars, function(x) as.character(x))
myindices<-sapply(mtcars, function(x) { grep("3",x, ignore.case = TRUE) })

Cela me donne une liste d'indices. Comment puis-je simplement obtenir un dataframe filtré à partir de l'original.

N'hésitez pas à critiquer mon approche, c'est le résultat final qui m'intéresse vraiment

r

1 commentaires

Qu'essayez-vous de réaliser exactement? Trouver des lignes contenant le chiffre 3?


5 Réponses :


6
votes

Nous pouvons utiliser filter_all de dplyr . Cela renvoie un dataframe avec des lignes contenant au moins une colonne contenant la chaîne "3":

mtcars %>%
  filter_all(all_vars(grepl("3", .)))

Si nous voulons un dataframe avec des lignes contenant toutes les colonnes contenant le chaîne "3". Nous utilisons all_vars au lieu de any_vars:

library(dplyr)

mtcars %>%
  filter_all(any_vars(grepl("3", .)))


0 commentaires

3
votes

Nous pouvons utiliser grepl avec Réduire de base R

out <- mtcars[Reduce(`|`, lapply(mtcars, grepl, pattern = "3")),]
dim(out)
#[1] 31 11


0 commentaires

0
votes

Une autre solution de base R:

mtcars[apply(mtcars,1,function(x) grepl("3",paste(x,collapse=""))),]


0 commentaires

3
votes

Semblable à votre solution sapply :

mtcars[grepl("3", do.call(paste0, mtcars), fixed = T),]

Vous pouvez également le faire:

mtcars[sapply(1:nrow(mtcars), function(i) any(grepl("3", mtcars[i,], fixed = T))),]

p>


0 commentaires

0
votes

Nous pouvons utiliser toString.

rbind(mtcars=dim(mtcars), mtcars.3=dim(mtcars.3))
         [,1] [,2]
mtcars     32   11
mtcars.3   31   11

Check:

mtcars.3 <- mtcars[grep("3", apply(mtcars, 1, toString)), ]

p >


0 commentaires