【问题标题】:Is it possible to extract multiple items from a list in R with map()?是否可以使用 map() 从 R 中的列表中提取多个项目?
【发布时间】:2016-12-06 23:45:20
【问题描述】:

使用 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 找到的文档和一些示例,但没有运气。有什么想法吗?

更新:我应该解释一下,理想情况下我希望能够按名称选择元素,如“沉默”。然而,这似乎不太好用。 (我有几个大列表,我想要更改的元素的位置)

【问题讨论】:

  • 要“按名称选择元素”,您可能必须为列表元素命名。使用命名列表可能是要走的路。然后,您可以将我们答案中的 1:2 替换为元素名称的向量,而无需进一步更改。

标签: r list dictionary purrr


【解决方案1】:

这样的?

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]))

【讨论】:

  • 甚至map(listy, ~ unlist(.[1:2]))
  • 感谢 Sumedh 和 Richard,这回答了我的问题。理想情况下,我希望避免使用 x[[1]] 符号,并且正如我在问题中编辑的那样,最好按名称选择元素(即 map(listy, "silence")),就像在 purrr 小插图中一样。关于如何做到这一点的任何想法?如果您可以将其添加到您的答案中,我会接受它作为答案。
  • 我的错误,可以使用@Sumedh 的答案和字符串来选择元素。谢谢!
【解决方案2】:

这里有两个带有 lapply 的基本 R 选项。

要保留嵌套列表结构,请使用

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-09
    • 2014-09-03
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多