2011-04-26 77 views
16

快速問題......無論如何,我可以通過一些對象循環並對​​每個對象應用一個函數?通過ls()或對象()循環?

當我輸入ls()objects()時,它返回一個對象名稱列表。我想遍歷這個列表,找出那些是data.frame,然後對每個對象運行一個函數。

如何通過函數從lsobjects傳遞條目?

道歉,如果這似乎是一個愚蠢的問題...

謝謝!

+3

我問了一個幾乎相同的問題[這裏](http://stackoverflow.com/questions/5158830/identify-all-objects-of-given-class-for-further-processing)。那裏的答案對我來說運作得很好。 – Chase 2011-04-26 21:22:19

回答

16

通過@jverzani約搞清楚哪些對象給出的答案是數據幀還是不錯的。所以讓我們從這個開始。但是我們只想選擇data.frames的項目。所以我們能做到這一點是這樣的:

#test data 
df <- data.frame(a=1:10, b=11:20) 
df2 <- data.frame(a=2:4, b=4:6) 
notDf <- 1 

dfs <- ls()[sapply(mget(ls(), .GlobalEnv), is.data.frame)] 

名稱的數據幀的現在在DFS字符串對象,以便可以將其傳遞給其他的功能,像這樣:

sapply(dfs, function(x) str(get(x))) 

我用get()命令實際上通過名稱獲取對象(請參閱R FAQ瞭解更多信息)

我已經回答了上面的問題,但我有一個懷疑,如果您要組織數據框架到列表項中,您的代碼將更加易讀易維護。很顯然,我不能肯定地說這個,但是我不能提出一個用例,它遍歷所有查找數據框的對象優於將數據框保存在列表中,然後調用該列表中的每個項。

+0

謝謝!這正是我正在尋找的! -rb – Ray 2011-04-26 22:43:51

11

您可以使用get或mget從名稱中獲取對象,並使用其中一個應用類型函數進行迭代。例如,

sapply(mget(ls(), .GlobalEnv), is.data.frame) 

會告訴您全局環境中的哪些項目是數據框架。要在函數中使用,您可以爲ls調用指定一個環境。

1

可以使用功能get()通過名字來引用一個對象

# Create some objects 
df <- data.frame(a=1:10) 
dl <- list(a=1, b=2, c=3) 

# Use `ls()` to return a list of object names 
lso <- ls() 

# Use `get()` to refer to specific objects 
class(get(lso[1])) 
[1] "data.frame" 

# Using an apply function to evaluate the class 
lapply(lso, function(x) class(get(x))) 
[[1]] 
[1] "data.frame" 

[[2]] 
[1] "list" 
2

使用inherits投擲混合物的另一種解決方案。它基本上(a)從當前環境獲取所有對象,並且(b)檢查它們是否從數據框繼承。

sapply(sapply(ls(), get), inherits, 'data.frame') 
5

您可以使用「eapply」循環環境中的對象。