如何在R中无需循环累加三列表生成的条件0-1矩阵?
替代循环的高效实现方案
当然可以!完全不需要用循环,用基础R的Map+Reduce或者purrr包的工具就能轻松搞定,代码更简洁还更高效。
方法1:基础R原生实现(无需额外包)
先利用Map函数对三个列表的对应位置元素逐一对齐处理,生成每个位置的0-1矩阵,再用Reduce把所有矩阵累加起来:
# 第一步:生成每个位置的判断结果矩阵 result_list <- Map(function(a, b, c) +(b > a & b < c), List.1, List.2, List.3) # 第二步:累加所有矩阵 zero.one.mat <- Reduce(`+`, result_list)
甚至可以把两步合并成一行更简洁的写法:
zero.one.mat <- Reduce(`+`, Map(function(a,b,c) +(b > a & b < c), List.1, List.2, List.3))
这里Map会自动遍历三个列表的第1到第500个元素,每次取出List.1[[i]]、List.2[[i]]、List.3[[i]]传入匿名函数做判断,+(...)是把布尔矩阵转成0-1矩阵的实用小技巧。
方法2:用purrr包更直观的写法
如果你习惯用tidyverse生态的工具,purrr的pmap+reduce组合写法可读性更强:
library(purrr) zero.one.mat <- pmap(list(List.1, List.2, List.3), ~ +(..2 > ..1 & ..2 < ..3)) %>% reduce(`+`)
pmap专门用来处理多个输入列表的对应元素,..1、..2、..3分别对应传入的三个列表(List.1、List.2、List.3),最后用reduce完成累加操作。
小提醒:你原代码里的bug
顺便提一句,你原来的循环代码里有个容易忽略的错误:循环体里写的是List.1[[1]],应该改成List.1[[i]]才对,不然每次都是和第一个矩阵比较,结果会完全不符合预期哦!
内容的提问来源于stack exchange,提问作者user321627
相关产品推荐
相关产品推荐

