首页 > 解决方案 > 如何使用 purrr 根据另一列中的值提取列表列中的元素

问题描述

如何使用 purrr 根据另一列中的值在列表列中找到元素?

例如,假设我有一个包含 2 列和 2 行的简单 tibble。第二列是一个列表列,两行都将“字母”向量显示为列表。第一列显示了我要提取的列表元素。

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”,因为这是字母向量的第二个元素:

# 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   

标签: rpurrr

解决方案


您必须使用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     

推荐阅读