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
3 Réponses :
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")))
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
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
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.