【问题标题】:R For loop/map2 that iterates over two listsR For循环/map2迭代两个列表
【发布时间】:2021-12-07 10:42:52
【问题描述】:

我已阅读 [this][1] 和 [this][2],但无法使其适应我的用例。我正在尝试使用openxlsx 函数writeData 来编写我保存在向量中的几个数据帧以及工作簿工作表的名称,也保存在向量中:

names_of_worksheets <- c(
  "total_suppliers",
  "nato_fvey_suppliers",
  "us_suppliers",
  "sole_sourcing",
  "single_sourcing",
  "geographic_risk_us_only",
  "foreign_dependence",
  "exposure_to_non_nato_fvey"
  )

names_of_dataframes <- c(
  total_suppliers,
  nato_fvey_suppliers,
  us_suppliers,
  sole_sourcing,
  single_sourcing,
  geographic_risk_us_only,
  foreign_dependence,
  exposure_to_non_nato_fvey
  )

我想写的伪代码是一个循环遍历两个列表/向量的 for 循环(我想我可以在 python 中完成):

for (name_of_worksheet, name_of_dataframe in names_of_worksheets, names_of_data_frames) {
 writeData(workbook, name_of_worksheet, name_of_dataframe)
}

这当然行不通。我已经尝试过map2,但遇到了一个我无法处理的错误:

map2(names_of_worksheets, names_of_dataframes, writeData, workbook)

Error: Mapped vectors must have consistent lengths:
* `.x` has length 8
* `.y` has length 25

有什么想法吗?谢谢! [1]:Looping over multiple lists with base R [2]:R Loop Iterating Over Two Lists

【问题讨论】:

  • 您的工作簿对象是什么样的?它是一个 data.frames 列表?

标签: r for-loop mapping openxlsx


【解决方案1】:

我认为您可能希望使用 list() 而不是 c() 来收集数据框。

后者将获取数据帧的所有列并将它们作为独立元素放入列表中(这就是您得到不一致长度错误的原因),而前者将它们作为单独的元素保存。 map2 应该可以同时迭代。

看起来writeData 将工作簿作为第一个元素,目前您的 map2 调用会将其用作第三个元素,所以也许您想将其重写为

map2(names_of_worksheets, names_of_dataframes, function(x,y) writeData(workbook, x, y))

【讨论】: