Создание вектора имен из списка и вложенного списка в R - PullRequest
0 голосов
/ 13 мая 2019

У меня есть вложенный список, и я хочу создать символьный вектор (для путей к файлам / выходных данных) путем итерации по элементам списка и подэлементам каждого элемента в R. Список содержит 174 элемента, и каждый из эти элементы имеют пять подэлементов (имена этих подэлементов согласованы для каждого элемента списка).

См., Например, следующий вложенный список, который имеет два элемента с пятью подэлементами каждый:

iter1 <- list(item1 = "a", item2 = "b",item3 = "c", item4 = "d",item5 = "e")
iter2 <- list(item1 = "a", item2 = "b",item3 = "c", item4 = "d",item5 = "e")
All <- list(iter1 = iter1, iter2 = iter2)

Требуемый векторный вывод будет иметь следующую структуру (при условии, что все выходные данные сохраняются в папке, помеченной как «output»:

[1] "output/iter1_item1.png"  
[2] "output/iter1_item2.png"  
[3] "output/iter1_item3.png"  
[4] "output/iter1_item4.png"  
[5] "output/iter1_item5.png"  
[6] "output/iter2_item1.png"...etc. 

Если я не ошибаюсь, длина вектора символов должна быть 870 (174 * 5).

Я очень близок со следующим кодом:

for(i in 1:length(All)){
output_names <- paste0("output/",names(All[i]),"_",names(All[[i]]),".png")}

Создает символьный вектор длиной 5 - по сути, первый элемент с каждым из пяти подэлементов. Мне бы хотелось, чтобы код перебирал каждый элемент, чтобы и остальные из них были захвачены (приведенный выше воспроизводимый пример содержит только два элемента, но мой исходный список содержит 175 элементов).

Заранее благодарим за любую помощь по этому вопросу.

1 Ответ

0 голосов
/ 13 мая 2019

Используя данные примера, вы можете повторять имена верхнего уровня соответствующее количество раз, и sapply над списком, чтобы получить имена нижнего уровня.

paste0('output/', rep(names(All), lengths(All)), '_', sapply(All, names), '.png')

#  [1] "output/iter1_item1.png" "output/iter1_item2.png" "output/iter1_item3.png"
#  [4] "output/iter1_item4.png" "output/iter1_item5.png" "output/iter2_item1.png"
#  [7] "output/iter2_item2.png" "output/iter2_item3.png" "output/iter2_item4.png"
# [10] "output/iter2_item5.png"

Если ваши подсписки имеют разную длину, вам нужно unlist(lapply(All, names)) вместо sapply(All, names).

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