如何使用purrr根据另一列中的值在列表列中找到元素?
例如,假设我有一个简单的小标题,包含2列2行。第二列是列表列,两行都将“字母”向量显示为列表。第一列显示了我要提取的列表元素。
library(dplyr)
library(purrr)
lets <- tibble(posn = 1:2,
lets_list = list(letters, letters)) %>%
glimpse()
返回:
Observations: 2
Variables: 2
$ posn <int> 1, 2
$ lets_list <list> [<"a", "b", "c", "d", "e", "f
使用purrr软件包,我可以执行以下命令:
lets %>%
mutate(lets_sel = map_chr(lets_list, 2))
返回一个新列“ lets_sel”,其值为“ b”,因为这是字母vector的第二个元素:
# A tibble: 2 x 3
posn lets_list lets_sel
<int> <list> <chr>
1 1 <chr [26]> b
2 2 <chr [26]> b
但是,我想使用 posn 列中的值来指定要返回 lets_list 列表中的哪个元素。
我尝试此命令没有成功。
lets %>%
mutate(lets_sel = map_chr(lets_list, posn))
> lets %>%
+ mutate(lets_sel = map_chr(lets_list, posn))
Error in mutate_impl(.data, dots) :
Evaluation error: Result 1 is not a length 1 atomic vector.
以及众多变体,例如:
lets %>%
mutate(lets_sel = lets_list[[posn]])
但是这会返回不正确的结果,并带有“ b”和“ b”而不是“ a”和“ b”:
# A tibble: 2 x 3
posn lets_list lets_sel
<int> <list> <chr>
1 1 <chr [26]> b
2 2 <chr [26]> b
答案 0 :(得分:1)
由于这需要两个参数,因此您必须使用map2_chr
lets %>%
mutate(lets_sel = map2_chr(lets_list, posn,~.x[.y]))
A tibble: 2 x 3
posn lets_list lets_sel
<int> <list> <chr>
1 1 <chr [26]> a
2 2 <chr [26]> b