2012-10-08 40 views
6

Trong Stata, lệnh lookfor cung cấp một cách nhanh chóng để tìm kiếm các biến trong tập dữ liệu (và nó tìm kiếm cả tên biến và nhãn). Vì vậy, lookfor education nhanh chóng tìm thấy các biến liên quan đến giáo dục. Có chức năng tắt tương đương trong R không?Có cách nào nhanh chóng để tìm kiếm các biến trong R?

+3

Bỏ phiếu để di chuyển sang stackoverflow nhưng bạn có thể kết hợp lệnh 'which()' với lệnh 'names()' nếu bạn đang làm việc với khung dữ liệu hoặc 'colnames()' nếu bạn đang làm việc với ma trận – Macro

Trả lời

6

Bạn có thể chỉ cần grep data.frame cho thông tin cần thiết. Sau đó, bạn sẽ nhận được nhiều thông tin hơn chỉ đơn giản là danh sách các tên của các biến mà ai đó được kết hợp. Bạn cũng có thể sử dụng cụm từ thông dụng, do đó tăng cường khả năng tìm kiếm của bạn. Dưới đây là ví dụ về chức năng thực hiện những gì bạn muốn (chỉ hoạt động với 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] 
} 

Đầu tiên tôi grep mỗi cột, sau đó tôi grep tên cột. Sau đó, tôi chỉ giữ thông tin cho dù grep phù hợp với bất cứ điều gì và ghi lại nó cho mỗi cột riêng biệt. Thay vì ..., bạn có thể chuyển bất kỳ đối số nào đến grep. Nếu bạn bỏ qua nó, hàm này sẽ thực hiện một kết hợp chuỗi đơn giản.

Dưới đây là một ví dụ:

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

Làm thế nào về vấn đề này như một oneliner mà tôi chạy vào lúc bắt đầu của một phiên:

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

nơi d là tên của bạn và data.frame p là mẫu.

Vì vậy

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

Và đây là một phiên bản mà không yêu cầu bạn phải trích dẫn tên biến

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

Nếu bạn chỉ cần tìm kiếm thông qua danh sách các biến để tìm một người bạn đang tìm kiếm thì có thể sử dụng hàm hoàn thành mã trong RStudio (v0.99 trở đi). Đơn giản chỉ cần bắt đầu gõ và bạn sẽ nhận được một danh sách các trận đấu có thể. Vì vậy, trong trường hợp của bạn, gõ education$ và danh sách các biến chứa trong khung dữ liệu sẽ xuất hiện. Di chuyển qua các tùy chọn này và chọn cái bạn muốn.

Các vấn đề liên quan