2012-10-08 12 views
6

En Stata, el comando lookfor ofrece una forma rápida de buscar variables en un conjunto de datos (y busca tanto nombres de variables como etiquetas). Entonces, lookfor education encuentra rápidamente variables relacionadas con la educación. ¿Hay una función de acceso directo equivalente en R?¿Existe una forma rápida de buscar variables en R?

+3

Votando para migrar a stackoverflow pero puedes combinar el comando 'which()' con el comando 'names()' para esto si estás trabajando con un marco de datos, o 'colnames()' si estás trabajando con una matriz – Macro

Respuesta

6

Puede simplemente grep el data.frame para la información necesaria. Entonces obtendrá mucha más información que simplemente la lista de nombres de variables con las que alguien está emparejado. También puede usar expresiones regulares, mejorando así sus capacidades de búsqueda. Aquí está el ejemplo de una función que hace lo que quiere (sólo funciona con hoja.de.datos):

lookfor <- 
function (pattern, data, ...) 
{ 
    l <- lapply(data, function(x, ...) grep(pattern, x, ...)) 
    res <- rep(FALSE, ncol(data)) 
    res[grep(pattern, names(data), ...)] <- TRUE 
    res <- sapply(l, length) > 0 | res 
    names(res) <- names(data) 
    names(res)[res] 
} 

Primero grep cada columna, entonces yo grep los nombres de columna. Luego solo guardo información sobre si grep coincide con algo y lo grabo para cada columna por separado. En lugar de ... puede pasar cualquier argumento al grep. Si lo omites, esta función hará una simple coincidencia de cadenas.

Aquí se muestra un ejemplo:

> dt<- data.frame(y=1:10,x=letters[1:10],a=rnorm(10)) 
> lookfor("a",dt) 
[1] "x" "a" 
2

¿Qué tal esto como una oneliner la que corro al comienzo de una sesión:

lkf <- function(d,p) names(d)[grep(p,names(d))] 

donde d es el nombre de su hoja.de.datos y p es el patrón.

Así

d <- data.frame(a=letters[1:10],b=1:10,c=month.name[1:10]) 
lkf(d,'c') 
# [1] "c" 

Y aquí es una versión que no requiere que citar los nombres de las variables

lookfor <- function(string_to_find, data){ 
    # Extract the arguments and force conversion to string 
    pars <- as.list(match.call()[-1]) 
    data.name <- as.character(pars$data) 
    var <- as.character(pars$string_to_find) 

    # Regular expression search through names 
    result <- names(data)[grep(var, names(data))] 

    if(length(result) == 0) { 
     warning(paste(var, "not found in", data.name)) 
     return(NULL) 
    } 
    else { 
     return(result) 
    } 
} 
0

Si sólo tiene que buscar por la lista de variables para encontrar la que están buscando, entonces es posible utilizar la función de finalización de código en RStudio (v0.99 en adelante). Simplemente comience a escribir y obtendrá una lista de posibles coincidencias. Entonces, en su caso escriba education$ y aparecerá una lista de variables contenidas en el marco de datos. Desplácese por estos y seleccione el que desee.

Cuestiones relacionadas