2011-03-28 51 views
2

假設我在R中的工作區中有幾個數據框,並且我想要列出所有數據框中列的名稱。查找工作區中所有數據框中所有列的名稱

我認爲以下工作。但事實並非如此。在你自己的工作區嘗試。

sapply(ls(),names) 

爲什麼不起作用? ls()創建所有數據框的列表,然後名稱函數應該應用於每個數據框。這是我現在的簡單問題。

接下來:我想確定所有具有名稱以字母在其中「日期」欄,這樣我可以在應用以下功能到每個這些列的,無論他們在什麼數據幀

as.Date(dataframe$dateofenrollment,origin="1899-12-30") 

回答

5

它不起作用,因爲ls()返回工作區中對象的名稱,而不是對象本身。

你可能想要的東西,像下面這樣:

lapply(ls(), function(x) if(is.data.frame(o <- get(x))) names(o)) 

這將對不屬於數據幀的任何對象NULL元素,但想必你可以解決這一點。

+0

感謝解釋爲 「獲取」 功能的需要。你的一條線讓我知道我在找什麼。我使用Chase的建議對其進行了調整。我做了整個線路。 lapply(ls(),function(x)grep(「date | started」,if(is.data.frame(o < - get(x)))names(o),ignore.case = TRUE,value = TRUE) )。這樣它會顯示其中包含「日期」或「已啓動」的變量的名稱。 – Farrel 2011-03-28 12:56:41

+0

if語句中的賦值。 **不寒而慄** – hadley 2011-03-28 13:01:59

2

您的問題的第一部分可以用allNames <- lapply(ls(), function(x) names(get(x)))回答。使用其中一個正則表達式函數來確定感興趣的列也應該是非常簡單的,像lapply(allNames, function(x) grepl("date", x))。關於如何取得前兩位數據並更新列數,我正在竭盡全力,但也許這會讓你和其他人走上正確的道路。

1

下面是一個簡單的例子來完成你的兩個目標的另一個解決方案。你可以很容易地修改它,以適應你的情況。如果您有任何問題,請告訴我。

# create a set of dummy data frames 
df1 = data.frame(x = rnorm(100), y = rnorm(100)) 
df2 = data.frame(x = rnorm(100), z = rnorm(100)) 
ch1 = c('a', 'b', 'c') 


# get all objects 
all.obj = sapply(ls(), get) 

# get data frames 
dfrs = all.obj[sapply(all.obj, is.data.frame)] 

# get data frames containing 'x' as column name 
dfrs2 = dfrs[lapply(dfrs, function(df) {'x' %in% names(df)}) == 'TRUE'] 

# replace x with square of x in all these data frames 
dfrs3 = lapply(dfrs2, function(df) {df$x = df$x^2; df}) 
+0

在你的R代碼行結尾處不需要所有的';'。 – 2011-03-28 09:12:50

+0

不錯的作品(+!)!這種方法的缺點是它會創建原始對象的副本並對其進行修改,而不是原來的'df1'和'df2'。您可能會遇到在現實應用程序中浮動的額外副本對象的內存問題。 – Chase 2011-03-28 12:57:47

+0

是的。你會如何建議使用lapply來修改函數範圍內的原始對象?你認爲 - >>是要走的路嗎? – Ramnath 2011-03-28 15:35:54

0
f <- function(){ 
lo <- ls(envir=.GlobalEnv) 
lo <- lo[sapply(lo,function(x) eval(substitute(class(X)=="data.frame", 
                list(X=as.name(x)))) 
        )] 
if(length(lo)>0){ 
    res <- lapply(lo,function(x) eval(substitute(names(X),list(X=as.name(x))))) 
    names(res) <- lo 
} else res <- NULL 
return(res) 
} 

編輯

ls.names <- function(){ 
    res <- lapply(mapply(as.name,ls(pos=1)), 
       function(x) if(class(xe<-eval(x))=="data.frame") names(xe)) 
    res <- res[!unlist(lapply(res,is.null))] 
    return(res) 
} 

EDIT2

eapply(env=.GlobalEnv,function(x) if(is.data.frame(x)) names(x)) 
相關問題