【问题标题】:Return multiple lists in mapply [duplicate]在mapply中返回多个列表[重复]
【发布时间】:2014-01-12 04:05:53
【问题描述】:

我有一个函数,我正在使用 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)。任何帮助将不胜感激!

谢谢, -切尔西

【问题讨论】:

  • mapply中设置SIMPLIFY = FALSE
  • 感谢您的回复!当我使用 SIMPLIFY=FALSE 运行此程序时出现错误:SI: 函数错误 (x) : 未使用的参数 (SIMPLY = dots[[2]][[1]])
  • 你需要使用SIMPLIFY=FALSE,而不是SIMPLY=FALSE (!)
  • 道歉 - 可怕的打字错误。这个结果确实给了我一个列表,但它是每个输入数据帧(df1 的 a:d 列表,df2 的 a:d 列表)。我想要的是每个输出数据帧的列表(a 的转换 df1:df2 列表,b 的转换 df1:df2 列表等)。
  • 您必须在 festum 之后进行该操作。 FWIW,Error in function (x) : unused argument(s) 始终意味着您指定了一个不存在的参数。

标签: r mapply


【解决方案1】:

怎么样:

使用mapply,但不要简化。

result1 <- mapply(func, x=df, SIMPLIFY=FALSE)

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

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

我尝试进一步缩短/混淆它(即消除定义匿名函数的需要),但是对于嵌套的lapplys,我不太清楚如何使它工作。

【讨论】:

  • 这行得通,它在我的输出中运行得很快。感谢您的解决方案!
  • 公平地说,我认为@HansRoggeman 的回答与我的基本相同;我的看起来更简单,因为(1)它的格式稍微好一点; (2) 他包含了数据生成代码; (3) 他添加了一些额外的功能来命名结果。
【解决方案2】:

这是一个提供您想要的解决方案。它基本上命名您的列表返回,然后按名称聚合。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 2020-10-16
    • 1970-01-01
    • 2012-12-29
    • 2017-06-03
    • 2011-05-10
    • 1970-01-01
    相关资源
    最近更新 更多