Есть ли быстрый способ поиска переменных в R?

В Stata команда lookfor предлагает быстрый способ поиска переменных в наборе данных (и ищет как имена переменных, так и метки). Таким образом lookfor education быстро находит вам переменные, связанные с образованием. Есть ли в R эквивалентная функция быстрого доступа?


person Eduard Grebe    schedule 08.10.2012    source источник
comment
Голосование за переход на stackoverflow, но вы можете комбинировать команду which() с командой names() для этого, если вы работаете с фреймом данных, или colnames(), если вы работаете с матрицей   -  person Macro    schedule 08.10.2012


Ответы (3)


Вы можете просто grep data.frame для получения необходимой информации. Тогда вы получите гораздо больше информации, чем просто список имен переменных, по которым кто-то подбирается. Вы также можете использовать регулярные выражения, тем самым расширяя возможности поиска. Вот пример функции, которая делает то, что вы хотите (работает только с data.frame):

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]
}

Сначала я ищу каждый столбец, затем - имена столбцов. Затем я сохраняю только информацию о том, соответствует ли grep чему-либо, и записываю ее для каждого столбца отдельно. Вместо ... вы можете передавать любые аргументы в grep. Если вы его опустите, эта функция выполнит простое сопоставление строк.

Вот пример:

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

Как насчет этого в качестве единственного лайнера, который я запускаю в начале сеанса:

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

где d - имя вашего data.frame, а p - шаблон.

So

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

А вот версия, в которой не требуется указывать имена переменных

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)
    }
}
person drstevok    schedule 14.10.2014

Если вам просто нужно выполнить поиск в списке переменных, чтобы найти ту, которую вы ищете, можно использовать функцию завершения кода в RStudio (начиная с версии 0.99). Просто начните печатать, и вы получите список возможных совпадений. Итак, в вашем случае введите education$, и появится список переменных, содержащихся во фрейме данных. Прокрутите их и выберите тот, который вам нужен.

person dpel    schedule 20.07.2015