r - 如何使用 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
解决方案
您必须使用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
推荐阅读
- redis - Spring Data Redis:Redis Pipeline hget 总是返回 null
- javascript - 如何根据许多其他元素隐藏一个元素
- wordpress - 在相同的 url 上使用 React For Mobile Devices
- networking - Kubernetes pods IP 应该可以从外部网络访问或 ping - 除了 master 和 worker
- python - 如何在表单中多次使用相同的字段?
- linux - 屏幕截图不包括 linux 中的某些窗口
- dart - setState() 如何重建子部件?
- drupal-8 - 如何创建多个下拉字段: - 基于 Drupal 8 中其他下拉字段的值?
- react-native - 我如何使用 setTimeout 在本机反应中中断获取请求?
- openedge - 是否可以从另一个窗口触发部分调用窗口过程?