我想在列表上添加一个顺序元素。假设我有以下列表
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
答案 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