首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在for循环中合并和命名数据帧

问在for循环中合并和命名数据帧
EN

Stack Overflow用户
提问于 2015-03-12 22:02:28
回答 2查看 388关注 0票数 2

我有一堆DF,叫做: df1,df2,.,dfN

lt1,lt2,.,ltN

我想把它们合并成一个循环,类似于:

代码语言:javascript
复制
for (X in 1:N){
outputX <- merge(dfX, ltX, ...)
}

但是,在每次迭代中,要更改输出、dfX和ltX的名称都有一些困难。我意识到plyr/data.table/reshape可能有一个更简单的方法,但我希望循环工作。

也许我应该澄清一下。DF是相当大的,这就是为什么plyr等不能工作(他们崩溃)。我想避免抄袭。代码中的下一个是保存合并的DF。这就是为什么我更喜欢for-循环分配,因为我知道每个合并的DF在环境中的名称。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-12 22:44:29

如果数据帧在列表中,则编写for循环非常简单:

代码语言:javascript
复制
# 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"))
}
票数 0
EN

Stack Overflow用户

发布于 2015-03-12 22:10:47

您可以将数据帧组合成列表并使用mapply,如下所示:

代码语言:javascript
复制
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

如果您想在全局环境中保存每个结果数据帧(但我建议不要这样做),您可以这样做:

代码语言:javascript
复制
result <- mapply(merge,L1,L2,SIMPLIFY=F)
names(result) <- paste0('output',seq_along(result))

它将给列表中的每个数据帧起一个名称,然后:

代码语言:javascript
复制
sapply(names(result),function(s) assign(s,result[[s]],envir = globalenv()))

请注意,所提供的是一个基本的R解决方案,基本上与您的示例代码相同。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29021099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档