Как я могу переименовать элементы списка в другом списке, используя для l oop? - PullRequest
0 голосов
/ 05 марта 2020

Ниже приведен лишь небольшой пример из большого набора данных

x <- data.frame(a = c(1,2), b= c(3,4))
y <- data.frame(a = c(1,2), b= c(3,4), c=c(5,6))
fir <- list(x=x,y=y)

w <- data.frame(a = c(7,8), b= c(9,10))
z <- data.frame(a = c(11,12), b= c(13,14), c=c(15,16), d=c(17,18))

sec <- list(x=w,y=z)

list <- list(fir,sec)

$pri
$pri$x
  a b
1 1 3
2 2 4

$pri$y
  a b c
1 1 3 5
2 2 4 6


$sec
$sec$x
  a  b
1 7  9
2 8 10

$sec$y
   a  b  c  d
1 11 13 15 17
2 12 14 16 18

Как переименовать список из семи c имен элементов в соответствующие x1 или xsec и y1 или ysec?

Как это

$pri
$pri$x
  a b
1 1 3
2 2 4

$pri$y
  a b c
1 1 3 5
2 2 4 6


$sec
$sec$x1
  a  b
1 7  9
2 8 10

$sec$y1
   a  b  c  d
1 11 13 15 17
2 12 14 16 18

или

$pri
$pri$x
  a b
1 1 3
2 2 4

$pri$y
  a b c
1 1 3 5
2 2 4 6


$sec
$sec$xsec
  a  b
1 7  9
2 8 10

$sec$ysec
   a  b  c  d
1 11 13 15 17
2 12 14 16 18

1 Ответ

0 голосов
/ 05 марта 2020

При работе со списками часто полезно 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 и т. Д.

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