从命名列表中提取元素,同时将名称保留在 R 中

Extract elements from a named list while keeping the name in R

我正在尝试从 R 中的列表中提取单个元素,并将该元素及其矢量名称存储为新列表。

假设我有一个名为 mylist 的列表,其中包含任意数量的命名向量,并且每个向量的长度可以变化,例如

mylist <- list("var1" = c(1,2,3), "var2" = c(10,8,4,2), "var3" = c(6,3), ...)

我知道我可以通过使用向量的名称或索引来获取单个元素,例如

mylist[["var1"]][1]
[1] 1
mylist[[2]][3]
[1] 4

但是,这些只是数值。我想要的是根据这个提取的值创建一个新列表,并使用从中提取它的向量的原始名称,例如

element1
$var1
[1] 1

element2
$var2
[1] 4

其中 element1 和 element2 是新列表。有没有有效的方法来做到这一点?

试试这个。您可以使用 mapply() 定义一个包含两个元素的函数:一个列表 x 和一个包含要提取的元素的所需位置的向量 n。有了它,您可以使用索引来包装函数,以获得接近您期望的列表 L 。这里的代码:

#Data
mylist <- list("var1" = c(1,2,3), "var2" = c(10,8,4,2))
#List
L <- mapply(function(x,n) x[n],x=mylist,n=c(1,3),SIMPLIFY = F)

输出:

L
$var1
[1] 1

$var2
[1] 4

我们可以使用 map2purrr

library(purrr)
map2(mylist, c(1, 3), `[[`)

-输出

#$var1
#[1] 1

#$var2
#[1] 4

或使用pluck

map2(mylist, c(1, 3), pluck)

或使用 base R

中的 Map
Map(`[[`, mylist, c(1, 3))

-输出

#$var1
#[1] 1

#$var2
#[1] 4

数据

mylist <- list("var1" = c(1,2,3), "var2" = c(10,8,4,2))

您可以使用 plucklist 的组合,如下所示。

library(purrr)
mylist <- list("var1" = c(1,2,3), "var2" = c(10,8,4,2), "var3" = c(6,3))
element1 <- mylist %>% pluck("var1") %>% .[1] %>% list("var1" = .)
element2 <- mylist %>% pluck("var2") %>% .[3] %>% list("var2" = .)