测试 R 中两个相同结构列表的每个元素的相等性:如何更快
Testing equality for each element of two identically structured lists in R: how to be faster
我的目标是获得一个与两个初始列表具有相同结构的列表,不同之处在于每个元素必须是一个逻辑向量。
考虑两个列表:
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。有没有更有效的替代方案?
你总是将向量作为列表的元素吗?
如果是这样,您可以使用矢量化 ==
。就这样
hin <- lapply(seq_along(mlist), function(i) {
mlist[[i]] == klist[[i]]
})
all.equal(hin, hon)
[1] TRUE
你可以考虑
unlist(klist) == unlist(mlist)
但这会丢弃列表格式。
您可以通过比较
来确定每个结果的原始索引
cumsum(lengths(mlist))
我的目标是获得一个与两个初始列表具有相同结构的列表,不同之处在于每个元素必须是一个逻辑向量。
考虑两个列表:
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。有没有更有效的替代方案?
你总是将向量作为列表的元素吗?
如果是这样,您可以使用矢量化 ==
。就这样
hin <- lapply(seq_along(mlist), function(i) {
mlist[[i]] == klist[[i]]
})
all.equal(hin, hon)
[1] TRUE
你可以考虑
unlist(klist) == unlist(mlist)
但这会丢弃列表格式。
您可以通过比较
来确定每个结果的原始索引cumsum(lengths(mlist))