我正在循环中工作,并在每次迭代时生成一个df。当我迭代时,我将结果加入到一个大表中。以下代码按预期工作,但似乎过于复杂。有没有办法简化这个,所以我不必有一个if / else块?
if(exists("ModelOutput.Full")){
ModelOutput.Full <- ModelOutput.Full%>%
distinct()%>%
left_join(ModelOutput, by = "ID")
} else {
ModelOutput.Full <- ModelOutput
}
我希望只使用else代码并让它在第一次迭代时创建ModelOutput.Full,但这不会发生。
另外,请随意提出我不会询问的其他优化建议。我相信他们存在。
编辑2:由于DSGym的输入,我已经得到了这个工作,虽然它略微修改了他们的答案,因为我在最初的问题中没有提供可重现的代码。以下是对我有用的说明:
regions <- c(1:7)
drivers <- c(1:5)
ModelOutput <- list()
ModelOutput.Regional <- list()
ID <- c(1:6961896)%>%
as.vector()%>%
as.data.frame()%>%
rename("ID"=".")
modelOutput <- list()
modelOutput.regional <- list()
for (region in regions) {
for (driver in drivers)
vals <- sample(0:10, 6961896, replace = TRUE)/10
outName <- paste("driver",driver,sep="")
vals <- vals%>%
as.vector()%>%
as.data.frame()%>%
rename(!!outName := ".")%>%
bind_cols(ID)
ModelOutput[[driver]] <- vals
}
ModelOutput.Regional[[region]] <- as.data.frame(Reduce(function(x, y) merge(x, y, by = "ID", all.x = TRUE), ModelOutput))
}
ModelOutput.Full <- Reduce(function(x, y) bind_rows(x, y), ModelOutput.Regional)
这会生成一个巨大数据框的所需输出,其中包含所有区域数据以及标记列中每个“驱动程序”的分数,如下所示:
ID driver1 driver2 driver3 driver4 driver5
1 0.1 0.2 0.4 0.6 0.4
2 0.4 0.6 0.5 0.7 0.7
3 0.3 0.7 0.5 0.2 0.3
没有可重现的例子,不是100%肯定如何做到这一点,但我认为这应该有所帮助:
storelist <- list() ## Store all your df´s
使用循环并像这样存储它
for(i in 1:length(dfs) {
storelist[[i]] <- dfs[[i]]
}
使用此功能按ID加入所有数据帧
Reduce(function(x) merge(x, by='ID', all.x=TRUE), storelist)
正如MrFlick在上面的评论中提到的那样。最终将数据框组合起来更容易。您可以执行以下操作。
由于我不知道你的循环结构是什么样的,我假设你可以生成一个名为dfs
的数据帧向量
# method 1
ModelOutput.Full = dplyr::bind_rows(dfs)
# method 2
ModelOutput.Full = do.call("rbind", dfs)