将位置索引添加到列表

时间:2019-03-06 20:17:25

标签: r list

我想在列表上添加一个顺序元素。假设我有以下列表

lst <- list("A"=list(e1="a",e2="!"), "B"=list(e1="b", e2="@"))
$A
$A$e1
[1] "a"

$A$e2
[1] "!"

$B
$B$e1
[1] "b"

$B$e2
[1] "@"

我想附加一个e3,它是该元素在列表中的位置索引,因此从本质上讲,我希望我的列表为:

$A
$A$e1
[1] "a"

$A$e2
[1] "!"

$A$e3
[1] 1

$B
$B$e1
[1] "b"

$B$e2
[1] "@"

$B$e3
[1] 2

6 个答案:

答案 0 :(得分:2)

setNames(lapply(seq_along(lst), function(i){
    temp = lst[[i]]
    temp$e3 = i
    temp
}), names(lst))
#$`A`
#$`A`$`e1`
#[1] "a"

#$`A`$e2
#[1] "!"

#$`A`$e3
#[1] 1


#$B
#$B$`e1`
#[1] "b"

#$B$e2
#[1] "@"

#$B$e3
#[1] 2

答案 1 :(得分:2)

这是一个不假定子列表具有相同已知元素数的解决方案。

library("tidyverse")
library("glue")

lst <- list("A"=list(e1="a",e2="!"), "B"=list(e1="b", e2="@"))

# The part
# `setNames(list(.y), glue("e{length(.x) + 1}"))`
# creates a one-element list named accordingly to append to the previous list
map2(lst, seq(lst),
     ~ append(.x, setNames(list(.y), glue("e{length(.x) + 1}") )))
#> $A
#> $A$e1
#> [1] "a"
#> 
#> $A$e2
#> [1] "!"
#> 
#> $A$e3
#> [1] 1
#> 
#> 
#> $B
#> $B$e1
#> [1] "b"
#> 
#> $B$e2
#> [1] "@"
#> 
#> $B$e3
#> [1] 2

# If naming the additional element is not important, then this can simplified to
map2(lst, seq(lst), append)
# or
map2(lst, seq(lst), c)

reprex package(v0.2.1)于2019-03-06创建

答案 2 :(得分:2)

另一个使用Map

的选项
Map(function(x, y) c(x, "e3" = y), x = lst, y = seq_along(lst))
#$A
#$A$e1
#[1] "a"

#$A$e2
#[1] "!"

#$A$e3
#[1] 1


#$B
#$B$e1
#[1] "b"

#$B$e2
#[1] "@"

#$B$e3
#[1] 2

这可以写得更简洁

Map(c, lst, e3 = seq_along(lst))

感谢@thelatemail

答案 3 :(得分:1)

假设我正确理解,您想向每个嵌套列表添加第3个元素,该列表中包含该列表在其父列表中的索引。这有效:

library(rlist)    
lst <- list("A"=list(e1="a",e2="!"), "B"=list(e1="b", e2="@"))
for(i in seq(1:length(lst))){
  lst[[i]] <- list.append(lst[[i]],e3=i)  
}
lst

答案 4 :(得分:1)

我们可以用lst沿lapply的长度循环,向每个元素添加此顺序索引。

lst2 <- lapply(seq_along(lst), function(i) {
    df <- lst[[i]]
    df$e3 <- i
    return(df)
})
names(lst2) <- names(lst) # Preserve names from lst

或者,如果您不担心就地修改:

lapply(seq_along(lst), function(i) {
    lst[[i]]$e3 <<- i
})

两者都给出相同的输出:

$A
$A$e1
[1] "a"
$A$e2
[1] "!"
$A$e3
[1] 1


$B
$B$e1
[1] "b"
$B$e2
[1] "@"
$B$e3
[1] 2

答案 5 :(得分:1)

我们也可以使用for循环

for(i in seq_along(lst)) lst[[i]]$e3 <- i