测试R中两个相同结构列表的每个元素的相等性:如何更快

时间:2018-03-17 13:33:12

标签: r performance list purrr

我的目标是获得一个与两个初始列表具有相同结构的列表,不同之处在于每个元素必然是一个逻辑向量。

考虑两个清单:

mlist <- rep(list(rep(c(0,2,4),68),c(1),
              sample(x = c("a","b"),size = 1, prob = c(.5,.5))),200)
klist <- rep(list(rep(c(0,2,3),68), c(0),
              sample(x = c("a","b"),size = 1, prob = c(.5,.5))),200)

请注意,在给定列表中,每个元素都是一个矢量,字符串或数字,并且它们的长度不一定相同。但是,两个列表都具有完全相同的结构。

我要查找的列表具有相同的结构,并指示两个列表的每个向量中的每个元素的相等性。 For循环提供了一个难以接受的解决方案:

hon <- as.list(rep(NA ,length(mlist)))
for(i in seq(length(mlist))){
  for (m in seq(length(mlist[[i]]))){
    hon[[i]][[m]] <- mlist[[i]][[m]]==klist[[i]][[m]]
  }
}

另一个使用purrr包的解决方案,更优雅但更慢,是

han <- map2(klist,  mlist, map2_lgl, identical)

for循环方法的经过时间为0.054,purr方法为0.129。是否有更有效的替代方案?

2 个答案:

答案 0 :(得分:1)

您是否始终将矢量作为列表的元素?

如果是这样,您可以使用矢量化==。只是做

hin <- lapply(seq_along(mlist), function(i) {
  mlist[[i]] == klist[[i]]
})

all.equal(hin, hon)
[1] TRUE

答案 1 :(得分:0)

你可以考虑

unlist(klist) == unlist(mlist)

但这会丢弃列表格式。

您可以通过与

比较来确定每个结果的原始索引
cumsum(lengths(mlist))