通过使用purrr包中的各种map()
函数,您可以将整数或字符串传递给函数,并从子列表中提取元素。这些工作正如我所期望的那样:
listy <- list(A = list("silence", "cats", X = list(Aa = "dogs", "birds")),
B = list("silence", "fish-head", Y = list(Bb = "fish-face", "squirrel")))
> str(listy)
List of 2
$ A:List of 3
..$ : chr "silence"
..$ : chr "cats"
..$ X:List of 2
.. ..$ Aa: chr "dogs"
.. ..$ : chr "birds"
$ B:List of 3
..$ : chr "silence"
..$ : chr "fish-head"
..$ Y:List of 2
.. ..$ Bb: chr "fish-face"
.. ..$ : chr "squirrel"
list1 <- listy %>% map(1) %>% str # returns "silence" from A and B
list2 <- listy %>% map(2) %>% str # returns "cats" and "fish-head"
list3 <- listy %>% map(c(3, 1)) %>% str # returns "dogs" and "fish-face" from the lists X and Y within the list.
我的问题是,如何从此列表中提取多个元素?如果我想要来自A和B的“沉默”,以及来自A和B的“猫”和“鱼头”(换句话说,A和B的元素1和2),map()
是可能的?如果没有,最好的方法是什么?
以下是我原本认为可行的方法:
list4 <- listy %>% map(1, 2) %>% str
其中1表示每个子列表中的第一个元素,2表示第二个元素。但这会返回与list1
相同的内容。使用c(1, 2)
不起作用,因为它引用了嵌套结构(即[[1]][[2]]
)。我查看了通过Google找到的文档和一些示例,但没有运气。有什么想法吗?
更新:我应该解释一下,理想情况下,我希望能够按名称选择元素,如“沉默”。然而,这似乎并不太好。 (我有几个大的列表,其中我想要的元素的位置发生变化)
答案 0 :(得分:4)
这样的东西?
library(purrr)
listy %>% map(., function(x) c(x[[1]], x[[2]]))
$A
[1] "silence" "cats"
$B
[1] "silence" "fish-head"
以data.frame
,
listy %>% map_df(., function(x) c(x[[1]], x[[2]]))
# A tibble: 2 x 2
A B
<chr> <chr>
1 silence silence
2 cats fish-head
或者,正如@Richard Scriven所建议的那样,
map(listy, ~ unlist(.[1:2]))
答案 1 :(得分:0)
以下是基础R中lapply
的两个选项。
要保留嵌套列表结构,请使用
lapply(listy, "[", 1:2)
$A
$A[[1]]
[1] "silence"
$A[[2]]
[1] "cats"
$B
$B[[1]]
[1] "silence"
$B[[2]]
[1] "fish-head"
要返回单个矢量列表,请使用
lapply(listy, function(i) unlist(i[1:2]))
$A
"silence" "cats"
$B
"silence" "fish-head"
您可以在data.frame
中包装第二个方法以返回data.frame。
data.frame(lapply(listy, function(i) unlist(i[1:2])))
A B
1 silence silence
2 cats fish-head