R цикл со списком символов - PullRequest
1 голос
/ 14 марта 2019

Проблема здесь аналогична с предыдущей , но здесь нам не нужно делать какие-либо вычисления, а просто строить списки

У меня есть список регионов мира:

list.asia <- c("Central Asia", "Eastern Asia", "South-eastern Asia", "Southern Asia", "Western Asia")
list.africa <- c("Northern Africa", "Sub-Saharan Africa", "Eastern Africa", "Middle Africa", "Southern Africa", "Western Africa")

Я использую R library("ISOcodes") для создания списков стран с трехзначным форматом ISO Alpha следующим образом:

region <- subset(UN_M.49_Regions, Name %in% list.asia)
subset <- subset(UN_M.49_Countries, Code %in% unlist(strsplit(region$Children, ", ")))
subset$ISO_Alpha_3

Этот пример с list.asia дает ожидаемый результат:

 [1] "AFG" "ARM" "AZE" "BHR" "BGD" "BTN" "BRN" "KHM" "CHN" "HKG" "MAC" "CYP" "PRK"
[14] "GEO" "IND" "IDN" "IRN" "IRQ" "ISR" "JPN" "JOR" "KAZ" "KWT" "KGZ" "LAO" "LBN"
[27] "MYS" "MDV" "MNG" "MMR" "NPL" "OMN" "PAK" "PHL" "QAT" "KOR" "SAU" "SGP" "LKA"
[40] "PSE" "SYR" "TJK" "THA" "TLS" "TUR" "TKM" "ARE" "UZB" "VNM" "YEM"

, который можно легко сохранить следующим образом:

countries.list.asia <- subset$ISO_Alpha_3

Проблема в том, что у меня много регионов, и я бы предпочел сделать цикл.

Для простоты предположим, что у меня есть только 2 списка list.asia и list.africa. Я перегруппирую их в новый list.continent

list.continent <- c("list.asia","list.africa")

и тогда я "зацикливаю" список производства: (который не работает)

for(i in list.continent){
    list.loop <- sym(i)
    region <- subset(UN_M.49_Regions, Name %in% list.loop)
    subset <- subset(UN_M.49_Countries, Code %in% unlist(strsplit(region$Children, ", ")))
    paste("countries",list.loop, sep=".") <- subset$ISO_Alpha_3
    rm(region, subset, list.loop)
}

Ожидаемые результаты (в данном случае) - это 2 новых объекта (список классов) с именами countries.list.asia и countries.list.africa, содержащих трехзначные коды ISO стран, присутствующих в этих регионах.

Я пытался заменить list.loop на !!list.loop или as.list(list.loop), но ничего не работает. Любая идея?

1 Ответ

2 голосов
/ 14 марта 2019

Подумайте об использовании общего списка и не пытайтесь итеративно сохранять объект в глобальной среде, а используйте функцию, чтобы вернуть требуемый вывод и избежать необходимости удалять вспомогательные объекты.А в R функция list + может быть заключена в lapply (или ее обертку sapply, используемую здесь для имен списков):

# NAMED LIST OF ACTUAL OBJECTS (NOT CHARACTER VECTOR)
list.continent <- list(list.asia = list.asia, list.africa = list.africa)

# BUILD NEW LIST OF SUBSETTED ITEMS
new_list.continent <- sapply(list.continent, function(item) {    
    region <- subset(UN_M.49_Regions, Name %in% item)
    sub <- subset(UN_M.49_Countries, Code %in% unlist(strsplit(region$Children, ", ")))

    return(sub$ISO_Alpha_3)
}, simplify = FALSE)

# SHOW OBJECT CONTENTS
new_list.continent$list.asia

new_list.continent$list.africa
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...