R应用循环返回列表

时间:2017-01-02 21:47:47

标签: r for-loop lapply

我尝试在一个存在的R脚本中用for循环替换apply循环。不过,我的旧函数返回多个dataFrames列表,如return(list(df1,df2))。有关详细信息,请参见下面的示例:

旧脚本:

MyFunction = function(input){
  df1=array(NA,c(0,1))
  df2=array(NA,c(0,1))
  for(i in 1:n){
    ...
    df1 = rbind(df1,action1(input))
    df2 = rbind(df2,action2(input))
  }
return(list(df1,df2))

新剧本:

Object = do.call(rbind, lapply(1:n,function(i){
  df1 = action1(input)
  df2 = action2(input)
  return(list(df1,df2))
}))

我获得:

      [,1]   [,2]   [,3]   [,4]   [,5]  
 [1,] List,2 List,2 List,2 List,2 List,2
 [2,] List,2 List,2 List,2 List,2 List,2
 [3,] …

我不知道解决我的问题。任何帮助都会很感激。

谢谢你的进步,

B.Gees

1 个答案:

答案 0 :(得分:1)

do.call(rbind, ...)通常用于行绑定数据帧/矩阵列表。您有一个数据框列表,并且您希望相应地绑定它们,您可以尝试以下模式。

Object = do.call(Map, c(f = rbind, lapply(1:n,function(i){
  df1 = action1(input)
  df2 = action2(input)
  return(list(df1,df2))
})))

do.call(Map, ...)lapply返回的所有列表作为Map的参数传递,然后将所有数据帧从相同的位置传递到rbind。即所有df1将绑定在一起,所有df2将绑定在一起。