如何使用 for 循环重命名另一个列表中的列表元素?

Posted

技术标签:

【中文标题】如何使用 for 循环重命名另一个列表中的列表元素?【英文标题】:How can I rename the elements of the list within another list using for loop? 【发布时间】:2020-06-18 07:14:06 【问题描述】:

以下只是较大数据集中的一个小例子

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

如何将列表 sec 元素名称重命名为各自的 x1xsecy1ysec

这样

$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】:

使用列表时,使用map 函数而不是使用循环通常很有用。对于这种情况,您可以使用 indexed 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 行中有一些内容需要解压,所以我会介绍一下。 imap 获取一个列表(在本例中为您的 list &lt;- list(fir, sec))及其元素的名称或索引,并将某些函数应用于使用名称/索引的每个元素。

我将其浓缩为上面的一行,但我应用于每个列表的函数是:

function(l, n) 
  names(l) <- paste0(names(l), n)
  return(l)

l 是子列表,n 是父列表的名称(如果已命名)或索引(如果未命名)。我们获取子列表的名称并将名称/索引附加到已经存在的任何内容。在这种情况下,父列表没有命名元素,因此我们附加索引并获取具有名为 x1, y1x2, y2 等元素的子列表。

【讨论】:

以上是关于如何使用 for 循环重命名另一个列表中的列表元素?的主要内容,如果未能解决你的问题,请参考以下文章

使用 for 循环命名向量

重命名列表数据框中元素的最有效方法

如何使用列表重命名熊猫中的列

为啥 Python for 循环在遍历列表副本并进行删除时会跳过元素? [复制]

如何在 Python 的 for 循环中删除列表元素? [复制]

如何在一行for循环中的字典中添加另一个属性[重复]