我有一个函数,我正在使用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)。非常感谢任何帮助!
谢谢, -Chelsea
答案 0 :(得分:5)
怎么样:
使用mapply
但不要简化。
result1 <- mapply(func, x=df, SIMPLIFY=FALSE)
迭代索引(假设结果中的两个列表长度相同);对于每个索引i
,请使用lapply
提取i
中每个列表的result1
元素。
result2 <- lapply(seq_along(result1[[1]]),
function(i) lapply(result1,"[[",i))
我尝试了一点来进一步缩短/混淆这一点(即删除了定义匿名函数的需要),但是对于嵌套的lapply
,我无法弄清楚如何使它工作。< / p>
答案 1 :(得分: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