При работе со списками часто полезно map
выполнять над ними функции, а не использовать циклы. В этом случае вы можете использовать индексированную карту для изменения имен каждого элемента подсписка в соответствии с индексом его родительского списка:
library(purrr)
renamed_list <- imap(list, function(l, n) {names(l) <- paste0(names(l), n) ; l})
str(renamed_list)
#> List of 2
#> $ :List of 2
#> ..$ x1:'data.frame': 2 obs. of 2 variables:
#> .. ..$ a: num [1:2] 1 2
#> .. ..$ b: num [1:2] 3 4
#> ..$ y1:'data.frame': 2 obs. of 3 variables:
#> .. ..$ a: num [1:2] 1 2
#> .. ..$ b: num [1:2] 3 4
#> .. ..$ c: num [1:2] 5 6
#> $ :List of 2
#> ..$ x2:'data.frame': 2 obs. of 2 variables:
#> .. ..$ a: num [1:2] 7 8
#> .. ..$ b: num [1:2] 9 10
#> ..$ y2:'data.frame': 2 obs. of 4 variables:
#> .. ..$ a: num [1:2] 11 12
#> .. ..$ b: num [1:2] 13 14
#> .. ..$ c: num [1:2] 15 16
#> .. ..$ d: num [1:2] 17 18
Есть немного, чтобы распаковать в линия imap
, так что я пройду через нее go. imap
берет список (в данном случае ваш list <- list(fir, sec)
) и имена или индексы его элементов и применяет некоторую функцию к каждому элементу, который использует имена / индексы.
Я сократил его до одного строкой выше, но функция, которую я применяю к каждому списку:
function(l, n) {
names(l) <- paste0(names(l), n)
return(l)
}
l
- это подсписок, а n
- это имя (если указано) или индекс (если не указано) ) родительского списка. Мы берем имена нашего подсписка и добавляем имя / индекс к тому, что уже было там. В этом случае родительские списки не имеют именованных элементов, поэтому мы добавляем индекс и получаем подсписки с элементами с именами x1, y1
, x2, y2
и т. Д.