Как использовать цикл for с несколькими результатами

#r #loops #for-loop #indexing

Вопрос:

Я должен автоматизировать эту последовательность функций:

 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)
}
 

В результате я хочу «dist_ao» для каждого i. Индексированные значения должны быть найдены в isic столбцах WBES_sf_angola наборов данных и FDI_angola наборов данных.

Как я могу встроить индекс в имена различных элементов?

Редактировать:

Я попробовал со следующей модификацией:

 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)
}
 

и вывод-это просто список из 1, который содержит dist_ao_62 . Где я могу избежать перезаписи?

Комментарии:

1. Вы могли бы поместить элементы dist_ao_ в именованный список (т. Е. result_list <- list(); result_list[[paste0("dist_ao_", i)]] <- distm(WBES_angola_i,FDI_angola_i, fun = distGeo)/1000 В качестве альтернативы (и на самом деле не рекомендуется) вы могли бы использовать assign

2. ОК. Правильно ли проиндексированы остальные элементы? Я имею в виду, если для каждого значения i я хочу другое WBES_sf_angola_i , WBES_angola_i и FDI_angola_i , так ли я должен их индексировать?

3. В вашем текущем коде переменная WBES_sf_angola_i будет перезаписываться на каждой итерации цикла (т. Е. Есть только переменная с именем WBES_sf_angola_i , последняя буква «i» которой никогда не будет заменена текущим значением итератора i !) Если вы хотите динамически создавать имена, вы должны использовать что-то по paste() пути….

4. См.отредактированный вопрос. Должен ли я использовать paste() для каждого элемента цикла?

5. В своем отредактированном вопросе вы перезаписываете result_list его на каждой итерации. Вы должны вывести его из цикла 😉

Ответ №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 , которые вы можете преобразовать в a 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. 
 

Комментарии:

1. Я пытался. Он возвращает ошибку: Error in subset.default(WBES_sf_angola, isic == i) : object 'isic' not found

2. @nflore Вам не нужно специально упоминать, WBES_sf_angola$isic в подмножестве