我有一堆DF名称如:df1,df2,...,dfN
和lt1,lt2,...,ltN
我想在循环中合并它们,例如:
for (X in 1:N){
outputX <- merge(dfX, ltX, ...)
}
但是我在输出,dfX和ltX的名称在每次迭代中都有所改变。我意识到plyr / data.table / reshape可能有一个更简单的方法,但我希望循环工作。
也许我应该澄清一下。 DF非常大,这就是为什么plyr等不起作用(它们崩溃)的原因。我想避免复制。 代码中的下一个是保存合并的DF。 这就是为什么我更喜欢for-loop apporach,因为我知道在环境中命名的每个合并的DF是什么。
答案 0 :(得分:2)
您可以将数据框组合到列表中并使用mapply
,如下例所示:
i <- 1:3
d1.a <- data.frame(i=i,a=letters[i])
d1.b <- data.frame(i=i,A=LETTERS[i])
i <- 11:13
d2.a <- data.frame(i=i,a=letters[i])
d2.b <- data.frame(i=i,A=LETTERS[i])
L1 <- list(d1.a, d2.a)
L2 <- list(d1.b, d2.b)
mapply(merge,L1,L2,SIMPLIFY=F)
# [[1]]
# i a A
# 1 1 a A
# 2 2 b B
# 3 3 c C
#
# [[2]]
# i a A
# 1 11 k K
# 2 12 l L
# 3 13 m M
如果您想在全球环境中保存每个结果数据框(我建议不要这样做),您可以这样做:
result <- mapply(merge,L1,L2,SIMPLIFY=F)
names(result) <- paste0('output',seq_along(result))
将为列表中的每个数据框命名,然后是:
sapply(names(result),function(s) assign(s,result[[s]],envir = globalenv()))
请注意,提供的基本R解决方案与示例代码基本相同。
答案 1 :(得分:0)
如果你的数据框在列表中,写一个for循环是微不足道的:
# lt = list(lt1, lt2, lt3, ...)
# if your data is very big, this may run you out of memory
lt = lapply(ls(pattern = "lt[0-9]*"), get)
merged_data = merge(lt[[1]], lt[[2]])
for (i in 3:length(lt)) {
merged_data = merge(merged_data, lt[[i]])
save(merged_data, file = paste0("merging", i, ".rda"))
}