【问题标题】:Save every R for loop iteration in a new list将每个 R for 循环迭代保存在一个新列表中
【发布时间】:2016-05-04 12:25:28
【问题描述】:

我正在使用 Synth 包的 dataprep 功能(请参阅https://cran.r-project.org/web/packages/Synth/Synth.pdf)。

我在 R 中有以下要循环的命令:

dataprep.out <- dataprep(foo=expenditures,
     predictors=c("pop_tot", "share_yng", "share_old", "unempl", "sign_pop_initiative", "cab_size", "parl_size"),
     predictors.op="mean",
     dependent="exp_welf",
     unit.variable="canton",
     unit.names.variable="canton_abr",
     time.variable="year",
     treatment.identifier=7,
     controls.identifier=c(6, 8, 15, 16),
     time.optimize.ssr=1980:1995,
     time.plot=1980:2007,
     time.predictors.prior=1980:1995
     )

class(dataprep.out)
[1] "list"

到目前为止一切顺利。结果是一个列表[8]。现在我想循环命令(注意 treatment.identifiercontrols.identifier 的变化:

for (i in c(6,8,15,16)){dataprep(foo=expenditures,
                     predictors=c("pop_tot", "share_yng", "share_old", "unempl", "sign_pop_initiative", "cab_size", "parl_size"),
                     predictors.op="mean",
                     dependent="exp_welf",
                     unit.variable="canton",
                     unit.names.variable="canton_abr",
                     time.variable="year",
                     treatment.identifier=i,
                     controls.identifier=c(6,8,15,16)[c(6,8,15,16) !=i],
                     time.optimize.ssr=1980:1995,
                     time.plot=1980:2007,
                     time.predictors.prior=1980:1995)}

如何将每个迭代保存在它自己的列表中?我想要一份清单,例如dataprep.out"i",适用于每次迭代,因此适用于每个对象 "i"(dataprep.out6;dataprep.out8 等)。

我想我必须先创建这些对象,这样循环才能将其结果保存到相应的列表中。不过,我正在努力解决我必须准确创建的对象。而且我不知道如何告诉 for 循环将每个结果分配给仅在“i”中变化的列表(dataprep.out“i”,其中“i”在变化)。

【问题讨论】:

  • 我们使用返回列表而不是forloop的函数,例如:res &lt;- lapply(c(6,8,15,16), function(i){ do some stuff return(result) })
  • 感谢您的快速答复!

标签: r for-loop


【解决方案1】:

您可以在之前创建列表,然后向其中添加项目,如

i_list=c(6,8,15,16)
result_list=list()
for (i in seq(i_list)){
  result_list[[i]]=dataprep(...)}

但您需要更改标识符

treatment.identifier=i_list[[i]],
controls.identifier=c(6,8,15,16)[c(6,8,15,16) !=i_list[[i]]]

但是像@zx8754 所说的那样, lapply 变体更好

result_list=lapply(i_list,function(i) dataprep(...))

【讨论】:

  • 我尝试了 lapply 版本,result_listlist[4]。使用result_list[1],我可以访问i=6 的结果,使用result_list[8],我可以访问i=2 的结果。它是否正确?但我不知道如何像 dataprep.out$X1 那样访问 X1。
  • 尝试 result_list[[1]] ( double [ 用于获取第一个元素)/ 使用 X1 像 result_list[[1]]$X1 .... result_list[[1]] - 从数组 c( 6,8,15,16)
  • result_list[[1]]$X1 工作!感谢您对我所有问题的及时回答,先生。
猜你喜欢
  • 2021-12-07
  • 2021-04-13
  • 1970-01-01
  • 2023-03-25
  • 2021-02-25
  • 2018-02-13
  • 2020-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多