【问题标题】:How to use a for loop with multiple results如何使用具有多个结果的 for 循环
【发布时间】:2021-11-20 13:54:02
【问题描述】:

我必须自动化这一系列功能:

for (i in c(15,17,20,24,25,26,27,28,29,45,50,52,55,60,62)) {

WBES_sf_angola_i <- subset(WBES_sf_angola, isic == i)
WBES_angola_i <- as_Spatial(WBES_sf_angola_i)             

FDI_angola_i <- FDI_angola[FDI_angola$isic==i,]           

dist_ao_i <- distm(WBES_angola_i,FDI_angola_i, fun = distGeo)/1000    

rm(WBES_sf_angola_i,WBES_angola_i,FDI_angola_i)
}

因此,我希望每个 i 都有一个“dist_ao”。索引值位于 WBES_sf_angola FDI_angola 数据集的 isic 列中。

如何将索引嵌入到各种项目的名称中?

编辑:

我尝试了以下修改:

for (i in c(15,17,20,24,25,26,27,28,29,45,50,52,55,60,62)) {

WBES_sf_angola_i <- subset(WBES_sf_angola, isic == i)
WBES_angola_i <- as_Spatial(WBES_sf_angola_i)             

FDI_angola_i <- FDI_angola[FDI_angola$isic==i,]           

result_list <- list()
  
result_list[[paste0("dist_ao_", i)]] <-  distm(WBES_angola_i,FDI_angola_i, fun = distGeo)/1000  

rm(WBES_sf_angola_i,WBES_angola_i,FDI_angola_i)
}

输出只是一个包含dist_ao_62 的列表。我应该在哪里避免覆盖?

【问题讨论】:

  • 你可以将 dist_ao_ 元素放在一个命名列表中(即result_list &lt;- list(); result_list[[paste0("dist_ao_", i)]] &lt;- distm(WBES_angola_i,FDI_angola_i, fun = distGeo)/1000 或者(不是真的推荐)你可以使用assign
  • 好的。其余项目是否以正确的方式编入索引?我的意思是,如果对于 i 的每个值我想要不同的 WBES_sf_angola_i WBES_angola_i FDI_angola_i ,我应该这样索引它们吗?
  • 在您当前的代码中,变量 WBES_sf_angola_i 将在循环的每次迭代中被覆盖(即只有一个名为 WBES_sf_angola_i 的变量,其最后一个字母“i”永远不会替换为迭代器的当前值i!)如果要动态创建名称,则必须沿paste() 路径使用某些东西....
  • 查看已编辑的问题。我应该为循环的每个元素使用paste() 吗?
  • 在您编辑的问题中,您会在每次迭代时覆盖 result_list。你应该把它移出循环;)

标签: r loops for-loop indexing


【解决方案1】:

未经测试(由于缺少 MRE)但应该可以工作:

result_list <- list()

for (i in c(15,17,20,24,25,26,27,28,29,45,50,52,55,60,62)) {

  result_list[[paste0("dist_ao_", i)]] <-  distm(as_Spatial(subset(WBES_sf_angola, isic == i))  , FDI_angola[FDI_angola$isic==i,], fun = distGeo)/1000  

}

【讨论】:

    【解决方案2】:

    你可以这样处理。所有生成的dataframes 都将包含在list 中,您可以从此处代码的最后一行将其转换为dataframe。注意:由于不可重现,我主要从循环内的问题中获取代码。

    WBES_sf_angola_result <- list() # renamed this, as it seems you are using a dataset with the name WBES_sf_angola
    WBES_angola <- list()
    FDI_angola <- list()
    dist_ao <- list()
    
    
    for (i in c(15,17,20,24,25,26,27,28,29,45,50,52,55,60,62)) {
      
      WBES_sf_angola[[paste0("i_", i)]] <- subset(WBES_sf_angola, isic == i)
      WBES_angola[[paste0("i_", i)] <- as_Spatial(WBES_sf_angola_i)             
      
      FDI_angola[[paste0("i_", i)] <- FDI_angola[FDI_angola$isic==i,]           
      
      dist_ao[[paste0("i_", i)] <- distm(WBES_angola_i,FDI_angola_i, fun = distGeo)/1000    
      
      rm(WBES_sf_angola_i,WBES_angola_i,FDI_angola_i)
    }
    
    WBES_sf_angola_result <- do.call(rbind, WBES_sf_angola_result) # to get a dataframe
    

    您的子集数据也可以通过列表索引访问。例如。

    WBES_sf_angola_result[[i_15]] # for the first item. 
    

    【讨论】:

    • 我试过了。它返回一个错误:Error in subset.default(WBES_sf_angola, isic == i) : object 'isic' not found
    • @nflore 你不需要特别提到,WBES_sf_angola$isic 在子集中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 2023-02-08
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 2019-09-19
    • 2022-10-06
    相关资源
    最近更新 更多