如何使用R语言Purrr的map处理向量可变位置取值?
使用purrr的map函数按可变索引提取列表元素
问题背景
现有两个名称一一对应的列表:
list_1:包含5个长度为5的字符串向量,名称为1001-1005list_2:包含5个长度为2的整数向量,名称与list_1完全匹配,向量内的整数是要从list_1对应位置向量中提取元素的索引
原始定义代码:
library(purrr) # 需先加载purrr包 list_1 <- list( c("red","blue","blue","red","blue"), c("green","green","green","red","red"), c("blue","green","blue","red","red"), c("green","green","red","red","red"), c("red","blue","blue","red","green")) %>% set_names(c(1001, 1002, 1003, 1004, 1005)) list_2 <- list( c(2,4), c(1,5), c(3,1), c(4,5), c(4,4) ) %>% set_names(c(1001, 1002, 1003, 1004, 1005))
需求是:针对每一对同名向量,用list_2中的整数索引从list_1的对应向量中提取字符串,得到如下预期输出:
List of 5 $ 1001: chr [1:2] "blue" "red" $ 1002: chr [1:2] "green" "red" $ 1003: chr [1:2] "blue" "blue" $ 1004: chr [1:2] "red" "red" $ 1005: chr [1:2] "red" "red"
已知固定索引可通过map(list_1, ~.x[[固定值]])实现,但需要处理每个元素索引可变的场景。
解决方案
方法1:使用purrr::map2()
map2()是purrr包中专门用于同时遍历两个等长列表的函数,可将对应位置的元素配对处理:
result <- map2(list_1, list_2, ~.x[.y])
解释:
- 前两个参数传入需要配对的
list_1和list_2 - 匿名函数
~.x[.y]中,.x指代list_1当前位置的字符串向量,.y指代list_2当前位置的索引向量,用[.y]即可按索引批量提取元素
运行后输出与预期完全一致:
> result $`1001` [1] "blue" "red" $`1002` [1] "green" "red" $`1003` [1] "blue" "blue" $`1004` [1] "red" "red" $`1005` [1] "red" "red"
方法2:使用base R的mapply()
如果不想加载purrr包,可使用base R原生的mapply()函数实现相同效果:
result <- mapply(function(x, y) x[y], list_1, list_2, SIMPLIFY = FALSE)
其中SIMPLIFY = FALSE参数确保输出保持列表格式,避免被自动简化为矩阵或向量。
内容的提问来源于stack exchange,提问作者Jakub Morze
相关产品推荐
相关产品推荐

