我有一个简单的问题,即使有许多相似的帖子,我仍然无法解决这个问题,因为我在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可能是一个更好的解决方案,但尽管经过了几个小时的尝试,我还是无法获得任何吸引力!
一个最谦虚的人(并且被我自己的无知贬低)谢谢你。
答案 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)
个变量。