【问题标题】:Merge and name data frames in for loop在 for 循环中合并和命名数据帧
【发布时间】:2015-03-12 22:02:28
【问题描述】:

我有一堆 DF,名字如下:df1, df2, ..., dfN

和 lt1, lt2, ..., ltN

我想将它们合并成一个循环,例如:

for (X in 1:N){
outputX <- merge(dfX, ltX, ...)
}

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

也许我应该澄清一下。 DF 非常大,这就是 plyr 等不起作用(它们崩溃)的原因。我想避免复制。 代码中的下一个是保存合并的 DF。 这就是为什么我更喜欢 for-loop 方法的原因,因为我知道每个合并的 DF 在环境中的名称。

【问题讨论】:

  • 如果它们在一个列表中会容易得多,例如一个名为lt 的列表,其中包含 N 个元素,每个元素都是一个数据框。下次See here

标签: r for-loop merge


【解决方案1】:

您可以将数据框组合成列表并使用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()))

请注意,provided 是一个基本的 R 解决方案,其功能与您的示例代码基本相同。

【讨论】:

  • 另见?list2env 将列表折叠成全局环境中的元素。通常是个坏主意,但功能相当简洁。
  • 您为什么建议不要在全球范围内保存它们?
【解决方案2】:

如果您的数据框在列表中,则编写 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"))
}

【讨论】:

    猜你喜欢
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2017-08-16
    相关资源
    最近更新 更多