Come seleziono le variabili in un dataframe R il cui nome contiene una stringa particolare?

Due esempi sarebbero molto utili per me.

Come selezionerei: 1) variabili il cui nome inizia con b o B (cioè senza distinzione tra maiuscole e minuscole) o 2) variabili il cui nome contiene un 3

df <- data.frame(a1 = factor(c("Hi", "Med", "Hi", "Low"), levels = c("Low", "Med", "Hi"), ordered = TRUE), a2 = c("A", "D", "A", "C"), a3 = c(8, 3, 9, 9), b1 = c(1, 1, 1, 2), b2 = c( 5, 4, 3,2), b3 = c(3, 4, 3, 4), B1 = c(3, 6, 4, 4)) 

Se vuoi solo i nomi delle variabili:

 grep("^[Bb]", names(df), value=TRUE) grep("3", names(df), value=TRUE) 

Se vuoi selezionare quelle colonne, allora neanche

 df[,grep("^[Bb]", names(df), value=TRUE)] df[,grep("^[Bb]", names(df))] 

Il primo utilizza la selezione per nome, il secondo utilizza la selezione di un insieme di numeri di colonna.

Mentre mi piace la risposta di cui sopra, ho voluto dare una soluzione “tidyverse” pure. Se stai facendo un sacco di pipe e provi a fare diverse cose contemporaneamente, come faccio spesso, questa risposta potrebbe piacerti. Inoltre, trovo questo codice più leggibile “umanamente”.

La funzione select_vars selezionerà le variabili da un vettore di caratteri nel primo argomento, che dovrebbe contenere i nomi del frame di dati corrispondente, in base a una funzione di selezione starts_with come starts_with o matches

 library(dplyr) df <- data.frame(a1 = factor(c("Hi", "Med", "Hi", "Low"), levels = c("Low", "Med", "Hi"), ordered = TRUE), a2 = c("A", "D", "A", "C"), a3 = c(8, 3, 9, 9), b1 = c(1, 1, 1, 2), b2 = c( 5, 4, 3,2), b3 = c(3, 4, 3, 4), B1 = c(3, 6, 4, 4)) #will select the names starting with a "b" or a "B" select_vars(names(df), starts_with('b', ignore.case = TRUE)) #use select in conjunction with the previous code df %>% select(select_vars(names(df), starts_with('b', ignore.case = TRUE))) #Alternatively select_vars(names(df), matches('^[Bb]')) 

Si noti che il valore predefinito per ignore.case è TRUE , ma lo metto qui per mostrare esplicitamente, e nel caso in cui i futuri lettori siano curiosi su come regolare il codice. Anche usare gli argomenti include ed exclude è molto utile. Ad esempio, potresti usare select_vars(names(df), matches('^[Bb]'), include = 'a1') se vuoi che tutto inizi con una “B” o una “b”, e vuoi includi anche “a1”.