3
votes

Syntaxe correcte pour filtrer ou sélectionner des lignes dans un bloc de données à l'aide d'une fonction

J'essaie de filtrer ou de sous-ensemble un bloc de données afin qu'il n'inclue que les lignes dont le contenu d'une colonne commence par une certaine lettre.

J'ai essayé d'utiliser subset et filtre et sélectionnez (y compris starts_with de dplyr ) mais je n'arrive pas à trouver la bonne syntaxe pour réaliser ce dont j'ai besoin . Tous les exemples que j'ai trouvés démontrent le filtrage selon une valeur, par exemple x> 1 ou similaire, plutôt que via une fonction. Je n'ai réussi qu'à créer une variété stupéfiante de messages d'erreur différents.

refs: https://www.rdocumentation.org/packages/dplyr/ versions / 0.7.8 / sujets / sélectionnez https://www.rdocumentation.org/packages/dplyr/ versions / 0.7.8 / topics / filter_all https://www.rdocumentation.org/packages/tidyselect/ versions / 0.1.1 / topics / select_helpers https://www.rdocumentation.org/packages/base/ versions / 3.5.1 / topics / startsWith Filtrer les lignes data.frame par une condition logique p >

subset <- test_frame$a %>% grep("^A", .)
## [1] 1 2 3

Voici quelques-unes des choses que j'ai essayées:

subset <- dplyr::filter(test_frame, dplyr::starts_with("A"), all_vars(. == a))
## Error: No tidyselect variables were registered
subset <- vars_select(test_frame, starts_with("A"))
## Error: `vars` must be a character vector
subset <- test_frame %>% dplyr::filter_if(test_frame$a, ~ starts_with("A"))
## Error: Can't convert a `factor` object to function


2 commentaires

lors de la création du dataframe, utilisez setStringsAsFactors = TRUE


En base R, test_frame <- data.frame (a, b, stringsAsFactors = FALSE); subset (test_frame, startsWith (a, "A")) - vous n'avez pas besoin de la syntaxe 'verse.


3 Réponses :


4
votes

Nous pouvons utiliser select_if pour sélectionner les colonnes en fonction d'une condition

i1 <- Reduce(`|`, lapply(test_frame[startsWith(names(test_frame), "a")],
            grepl, pattern ="^A"))
test_frame[i1,]

Ou pour filtrer les lignes

test_frame %>%
     filter_at(vars(starts_with("a")), any_vars(str_detect(., "A")))

Ou en utilisant un sous-ensemble de colonnes

test_frame %>% 
     filter_all(any_vars(str_detect(., "A")))
#      a       b
#1 A1435 place 1
#2 A6732 place 2
#3 A8841 place 3

Ou en utilisant base R

test_frame %>% 
    select_if( ~ any(str_detect(.x, "A")))


0 commentaires

3
votes

Vous pouvez utiliser grepl

 test_frame[grepl("^A", test_frame$a), ]
      a       b
1 A1435 place 1
2 A6732 place 2
3 A8841 place 3


0 commentaires

2
votes

Une solution moins efficace ajoutée pour la variété:

 test_frame[startsWith(as.character(test_frame$a),"A"),]


   #    a       b
   # 1 A1435 place 1
   # 2 A6732 place 2
   # 3 A8841 place 3


0 commentaires