如何使用 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 元素名称重命名为各自的 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】:使用列表时,使用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 <- list(fir, sec)
)及其元素的名称或索引,并将某些函数应用于使用名称/索引的每个元素。
我将其浓缩为上面的一行,但我应用于每个列表的函数是:
function(l, n)
names(l) <- paste0(names(l), n)
return(l)
l
是子列表,n
是父列表的名称(如果已命名)或索引(如果未命名)。我们获取子列表的名称并将名称/索引附加到已经存在的任何内容。在这种情况下,父列表没有命名元素,因此我们附加索引并获取具有名为 x1, y1
、x2, y2
等元素的子列表。
【讨论】:
以上是关于如何使用 for 循环重命名另一个列表中的列表元素?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Python for 循环在遍历列表副本并进行删除时会跳过元素? [复制]