在mapply中返回多个列表

5

我有一个函数,我正在使用mapply在数据框或矩阵(df)的列表上应用它。该函数基于原始数据框的某些转换标准输出四种不同类型的数据框(例如a:d),但是我遇到了问题,因为该函数只允许我输出一个结果。 我尝试将它们整理成列表,但是当我运行简化版本的函数时,我得到了以下结果。

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)。 非常感谢任何帮助!
谢谢, -切尔西

3
mapply中设置SIMPLIFY=FALSE - Blue Magister
谢谢您的回复!当我使用SIMPLIFY=FALSE运行此代码时,出现了一个错误:SI: Error in function (x) : unused argument(s) (SIMPLY = dots[[2]][[1]])。 - Chelsea
你需要使用 SIMPLIFY=FALSE,而不是 SIMPLY=FALSE (!) - Ben Bolker
抱歉,打字错误很糟糕。这个结果确实给了我一个列表,但它是每个输入数据框架的列表(df1的a:d列表,df2的a:d列表)。我想要的是每个输出数据框架的列表(a的转换后的df1:df2列表,b的转换后的df1:df2列表等)。 - Chelsea
你必须事后解决这个问题。顺便说一下,Error in function (x) : unused argument(s) 意味着你指定了一个不存在的参数。 - Roman Luštrik
2个回答

5
怎么样:
使用 mapply 但不要简化。
result1 <- mapply(func, x=df, SIMPLIFY=FALSE)

遍历索引(这假设结果中的两个列表长度相同); 对于每个索引 i,使用 lapply 来提取 result1 中每个列表的第 i 个元素。

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

我尝试把这个代码再次缩短/混淆(即删除定义匿名函数的需求),但嵌套的lapply让我无法完全想清楚如何使其正常工作。


这个很有效,而且输出速度很快。感谢您提供的解决方案! - Chelsea
公平地说,我认为@HansRoggeman的答案本质上与我的相同;我的看起来更简单,因为(1)它的格式略微更好;(2)他包括了数据生成代码;(3)他加入了一些额外的功能来命名结果。 - Ben Bolker

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接