2014-01-12 107 views
4

我有一個函數,我正在使用mapply跨數據框或矩陣(df)列表應用。該函數根據原始數據幀的一些轉換標準輸出四種不同類型的數據幀(例如a:d),但由於函數只能讓我輸出一個,所以我遇到了問題。我試圖將它們整理成一個列表,但是當我運行一個簡化的函數時,我得到了這個。在mapply中返回多個列表

df1<-matrix(rnorm(10), nrow=10, ncol=10) 
df2<-df1 
df<-list(df1, df2) 

func<-function (x) { 
    a<-x*1 
    b<-x*2 
    c<-x*3 
    d<-x*4 
    return(list(a,b,c,d)) 
} 

finalresult<-mapply(func, x=df) 

str(finalresult) 

List of 8 
$ : num [1:10, 1:10] -3.211 -0.121 -0.2 0.491 1.118 ... 
$ : num [1:10, 1:10] -6.422 -0.242 -0.4 0.982 2.235 ... 
$ : num [1:10, 1:10] -9.633 -0.362 -0.6 1.473 3.353 ... 
$ : num [1:10, 1:10] -12.844 -0.483 -0.8 1.964 4.471 ... 
$ : num [1:10, 1:10] -3.211 -0.121 -0.2 0.491 1.118 ... 
$ : num [1:10, 1:10] -6.422 -0.242 -0.4 0.982 2.235 ... 
$ : num [1:10, 1:10] -9.633 -0.362 -0.6 1.473 3.353 ... 
$ : num [1:10, 1:10] -12.844 -0.483 -0.8 1.964 4.471 ... 
- attr(*, "dim")= int [1:2] 4 2 

在這種情況下,你可以看到它只是給了我四個輸出數據幀的名單:從DF1(A d),然後追加從DF2權後的下一組輸出。我希望有一個輸出,每個數據幀轉換都放在一個列表中,我可以按類別訪問它(例如finalresults $ a)。任何幫助將非常感謝!

感謝, -Chelsea

+2

在'mapply'中設置'SIMPLIFY = FALSE'。 –

+0

謝謝你的迴應!我在運行SIMPLIFY = FALSE時遇到錯誤:SI:函數(x)中的錯誤:未使用的參數(SIMPLY = dots [[2]] [[1]]) – Chelsea

+0

您需要使用' SIMPLIFY = FALSE',而不是'SIMPLY = FALSE'(!) –

回答

3

如何:

使用mapply但不要簡化。迭代遍歷索引(假定結果中的兩個列表都是相同的長度);然後,對於每個索引i,請使用lapply來提取result1中每個列表的i th元素。

result2 <- lapply(seq_along(result1[[1]]), 
       function(i) lapply(result1,"[[",i)) 

我試着一點點地縮短/進一步混淆這一點(即刪除需要定義一個匿名函數),但與嵌套lapply的I不能完全弄清楚如何使它發揮作用。

+0

這有效,它通過我的輸出快速運行。感謝您的解決方案! – Chelsea

+0

要公平,我認爲@ HansRoggeman的答案與我的基本相同;我看起來更簡單,因爲(1)格式稍好; (2)他包含數據生成代碼; (3)他提供了一些額外的功能來命名結果。 –

1

這裏是一個解決方案,讓你想要什麼。它基本上命名你的列表返回,然後按名稱聚合。

df1<-matrix(rnorm(10), nrow=10, ncol=10) 
df2<-df1 
df<-list(df1, df2) 
namesToReferTo = letters[1:4] 
func<-function (x) { 
    a<-x*1; b<-x*2; c<-x*3; d<-x*4 
    retList = list(a,b,c,d) 
    names(retList)=namesToReferTo 
    return(retList) 
} 
finalresult = lapply(namesToReferTo, function(y) { lapply(lapply(df,func), function(x) { x[[y]] }) }) 
# alternatively: finalresult = lapply(namesToReferTo, function(y) { Map(function(x) { return(x[[y]])} , lapply(df,func)) }) 
names(finalresult) = namesToReferTo 
str(finalresult) 
finalresult$b