#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
в подмножестве