2013-08-22 45 views
2

我已經定義了一個函數(可以正常工作)。不過,我在工作空間中有20個數據幀,我希望lapply具有相同的功能(dat1到dat20)。將一個已定義的函數同時應用於所有數據幀

到目前爲止,它看起來像這樣:

dat1 <- func(dat=dat1) 
dat2 <- func(dat=dat2) 
dat3 <- func(dat=dat3) 
dat4 <- func(dat=dat4) 
... 
dat20 <- func(dat=dat20) 

但是,有沒有辦法馬上做到這一點更多地飄逸着較短的命令,即以lapply功能給所有dataframes?

我想這一點,但沒有奏效:

mylist <- paste0("dat", 1:20, sep="") 
lapply(mylist, func) 

回答

1

嘗試類似:

lapply(mget(ls(pattern="dat")),func) 

一些細節:pattern論點ls將限制對象名稱它列出(如,我假設你有其他對象,包括你在全球環境中的功能)。 mget從環境中檢索這些對象,並將它們轉換爲列表,然後您可以使用lapply函數。

+0

結果需要,雖然被分配回到工作區。 –

1

如果您有變量的名稱,則可以使用get()從工作空間中檢索值。相應的分配函數被調用assign()

mylist <- paste0("dat", 1:20) 
lapply(mylist, function(name) assign(name, func(dat=get(name)))) 
+0

或者稍微短一些,更隱晦:'lapply(mylist,assign,func(dat = get(name)))' –

1

所需行爲可以使用eval代替lapply來獲得。

假設mylist是要應用fun的data.frame的名稱。 mylist可能使用

mylist <- ls(pattern="dat") 

然後你可以用下面的代碼做的正是你想要的產生:

cCmd <- paste(mylist , "<- func(" ,mylist,")", sep="") 
eCmd <- parse(text=cCmd) 
eval(eCmd) 
+0

哇,這真的很棒!偉大的提示! – NoThanks

相關問題