在单独的数据帧中保存for循环的输出

时间:2014-03-14 23:03:20

标签: r for-loop

我有一个简单的问题,即使有许多相似的帖子,我仍然无法解决这个问题,因为我在R中有点傻笑,我没有得到无论我应该得到什么。我有两组文件,

All.Files <- objects(pattern="constant.country[0-9]{4}")
all.files <- objects(pattern="constant[0-9]{4}")

我希望合并

mergefun <- function(X1, Y1) {
    merge(X1, Y1, by = "id")
} 

然后将每次合并迭代保存到新的数据框

for (i in All.Files) {
    a <- get(i)
      { for (j in all.files)
         b <- get(j)
         d <- dataframe(mergefun(a, b))
         newname <- paste("C", substr(j, 9, 12), sep="")
         names(d) <- c("Id", "Country", "logGDP", "GRI", GRI.group", "Year")
         assign(newname,d)

       }  
    }

虽然我确信那里有更优雅的代码,但这段代码可以满足我的需求。问题是它只保存了合并的最后一次迭代,所以我只得到了第43次,而不是获得1:43的数据帧。我知道我在for循环中没有正确索引,但是我已经挣扎了好几个小时才能理解我的错误并且失败了。

对不起,我没有包含一个可重现的例子,但希望因为我的代码实际工作,有人能够立即看到我所缺少的东西,这将允许所有43次迭代通过assign输出。我也知道mapply可能是一个更好的解决方案,但尽管经过了几个小时的尝试,我还是无法获得任何吸引力!

一个最谦虚的人(并且被我自己的无知贬低)谢谢你。

1 个答案:

答案 0 :(得分:4)

for (i in All.Files) {
a <- get(i)
   for (j in all.files) {
     b <- get(j)
     d <- dataframe(mergefun(a, b))
     newname <- paste("C", substr(j, 9, 12), sep="")
     names(d) <- c("Id", "Country", "logGDP", "GRI", "GRI.group", "Year")
     assign(newname,d)

   }  
}

我修复了包围。还应该清楚的是,由于您的newname仅依赖于j,因此您的新变量将仅在外部for循环的最后一次迭代中创建。因此,您最终只得到length(all.files)个变量。