r - 将一个列表映射到另一个列表
问题描述
有两个列表列表,一个只包含值:
lists <- list(list(c(0, 0), c(2, 2, 2), c(3, 4, 4, 5), c(5, 6, 7, 5)),
list(c(0, 0), c(1, 1, 2), c(5, 5, 5), c(6, 6, 7, 7)))
> lists
[[1]]
[[1]][[1]]
[1] 0 0
[[1]][[2]]
[1] 2 2 2
[[1]][[3]]
[1] 3 4 4 5
[[1]][[4]]
[1] 5 6 7 5
[[2]]
[[2]][[1]]
[1] 0 0
[[2]][[2]]
[1] 1 1 2
[[2]][[3]]
[1] 5 5 5
[[2]][[4]]
[1] 6 6 7 7
而另一个列表只包含相应的名称:
names <- list(list(c(1, 2), c(1, 2, 3), c(1, 2, 3, 4), c(1, 2, 3, 4)),
list(c(1, 2), c(1, 2, 3), c(1, 2, 3), c(1, 2, 3, 4)))
> names
[[1]]
[[1]][[1]]
[1] 1 2
[[1]][[2]]
[1] 1 2 3
[[1]][[3]]
[1] 1 2 3 4
[[1]][[4]]
[1] 1 2 3 4
[[2]]
[[2]][[1]]
[1] 1 2
[[2]][[2]]
[1] 1 2 3
[[2]][[3]]
[1] 1 2 3
[[2]][[4]]
[1] 1 2 3 4
两个列表列表具有完全相同的结构和元素数量。如何使列表中的每个元素成为列表names
中每个对应元素的名称lists
(并添加“t”作为前缀),如下所示?
[[1]][[1]]
t1 t2
0 0
[[1]][[2]]
t1 t2 t3
2 2 2
[[1]][[3]]
t1 t2 t3 t4
3 4 4 5
[[1]][[4]]
t1 t2 t3 t4
5 6 7 5
[[2]]
[[2]][[1]]
t1 t2
0 0
[[2]][[2]]
t1 t2 t3
1 1 2
[[2]][[3]]
t1 t2 t3
5 5 5
[[2]][[4]]
t1 t2 t3 t4
6 6 7 7
解决方案
你可以写一个递归函数:
library(purrr)
fun <- function(x, y){
modify2(x, y, ~if(is_list(.x)) fun(.x, .y)
else set_names(.x, paste0('t', .y)))
}
fun(lists, names)
[[1]]
[[1]][[1]]
t1 t2
0 0
[[1]][[2]]
t1 t2 t3
2 2 2
[[1]][[3]]
t1 t2 t3 t4
3 4 4 5
[[1]][[4]]
t1 t2 t3 t4
5 6 7 5
[[2]]
[[2]][[1]]
t1 t2
0 0
[[2]][[2]]
t1 t2 t3
1 1 2
[[2]][[3]]
t1 t2 t3
5 5 5
[[2]][[4]]
t1 t2 t3 t4
6 6 7 7
推荐阅读
- android - Travis CI 环境变量“;” 预期的
- javascript - 如何检查 React-Native 中的水平或垂直图像状态?
- ibm-cloud - 这个量子循环代表什么?请描述这个电路发生了什么
- algorithm - 递归函数的时间复杂度是多少?
- c++ - CMake:防止在子目录库项目中构建测试可执行目标
- c - 如何在不按 ENTER 的情况下读取 C 中的数据?
- php - JQuery 表单验证器的 toggleDisabled 模块不适用于非“提交”类型的按钮
- python - 使用 BFS 在二叉树中查找和排序表兄弟
- reactjs - 反应导航 AppRegistry 未注册
- web-scraping - 网络抓取软件是“包装器”吗?