R中列表中向量的相应比较

corresponding comparison of vectors within a list in R

我有一个包含 4 个逻辑向量的列表 (mylist):

list(a = c(NA, FALSE, FALSE, TRUE, FALSE, NA, NA, NA, FALSE, 
FALSE, FALSE, FALSE, NA, FALSE, NA, FALSE, FALSE, TRUE, TRUE, 
TRUE, TRUE, NA, FALSE, NA, TRUE, FALSE, FALSE, NA, TRUE, FALSE, 
NA, TRUE, NA, TRUE, FALSE, NA, NA, NA, NA, FALSE, NA, NA, NA, 
NA, FALSE, FALSE, TRUE, NA, NA, NA, FALSE, NA, NA, TRUE, NA, 
FALSE, TRUE, NA, FALSE, TRUE, NA, NA, NA, NA, FALSE, NA, FALSE, 
NA, NA, NA, FALSE, TRUE, TRUE, NA, TRUE, NA, NA, FALSE, FALSE, 
TRUE, NA, FALSE, FALSE, FALSE, NA, NA, FALSE, NA, FALSE, NA, 
FALSE, NA, NA, NA, NA, FALSE, NA, TRUE, TRUE, FALSE, TRUE, NA, 
FALSE, TRUE, NA, TRUE, NA, TRUE, FALSE, NA, NA, FALSE, TRUE, 
FALSE, NA, FALSE, NA, TRUE, FALSE, NA, FALSE, FALSE, NA, TRUE, 
TRUE, NA, FALSE, TRUE, FALSE, FALSE, NA, NA, NA, NA, TRUE, FALSE, 
NA, NA, FALSE, NA, NA, NA, NA, NA, TRUE, NA, NA, FALSE, TRUE, 
NA, NA, NA, FALSE, NA, NA, NA, NA, NA, TRUE, TRUE, NA, FALSE, 
NA, NA, FALSE, NA, FALSE, TRUE, TRUE, FALSE, TRUE, NA, TRUE, 
NA, NA), b = c(NA, FALSE, FALSE, FALSE, FALSE, NA, NA, NA, FALSE, 
FALSE, FALSE, FALSE, NA, TRUE, NA, FALSE, TRUE, TRUE, FALSE, 
FALSE, FALSE, NA, FALSE, NA, FALSE, FALSE, FALSE, NA, TRUE, FALSE, 
NA, TRUE, NA, FALSE, FALSE, NA, NA, NA, NA, FALSE, NA, NA, NA, 
NA, FALSE, FALSE, TRUE, NA, NA, NA, FALSE, NA, NA, FALSE, NA, 
FALSE, TRUE, NA, FALSE, TRUE, NA, NA, NA, NA, TRUE, NA, FALSE, 
NA, NA, NA, FALSE, TRUE, TRUE, NA, TRUE, NA, NA, FALSE, FALSE, 
FALSE, NA, FALSE, FALSE, FALSE, NA, NA, FALSE, NA, TRUE, NA, 
TRUE, NA, NA, NA, NA, FALSE, NA, TRUE, TRUE, FALSE, FALSE, NA, 
FALSE, FALSE, NA, FALSE, NA, TRUE, FALSE, NA, NA, TRUE, FALSE, 
FALSE, NA, TRUE, NA, FALSE, FALSE, NA, FALSE, TRUE, NA, FALSE, 
FALSE, NA, TRUE, TRUE, FALSE, FALSE, NA, NA, NA, NA, TRUE, FALSE, 
NA, NA, TRUE, NA, NA, NA, NA, NA, FALSE, NA, NA, TRUE, TRUE, 
NA, NA, NA, FALSE, NA, NA, NA, NA, NA, FALSE, FALSE, NA, FALSE, 
NA, NA, FALSE, NA, TRUE, TRUE, FALSE, FALSE, FALSE, NA, FALSE, 
NA, NA), c = c(NA, FALSE, FALSE, FALSE, FALSE, NA, NA, NA, FALSE, 
FALSE, TRUE, FALSE, NA, FALSE, NA, TRUE, TRUE, TRUE, FALSE, FALSE, 
TRUE, NA, TRUE, NA, FALSE, FALSE, FALSE, NA, TRUE, FALSE, NA, 
TRUE, NA, FALSE, FALSE, NA, NA, NA, NA, FALSE, NA, NA, NA, NA, 
FALSE, FALSE, TRUE, NA, NA, NA, FALSE, NA, NA, FALSE, NA, FALSE, 
TRUE, NA, FALSE, FALSE, NA, NA, NA, NA, FALSE, NA, TRUE, NA, 
NA, NA, FALSE, TRUE, TRUE, NA, TRUE, NA, NA, FALSE, FALSE, FALSE, 
NA, FALSE, FALSE, TRUE, NA, NA, FALSE, NA, TRUE, NA, TRUE, NA, 
NA, NA, NA, FALSE, NA, FALSE, TRUE, FALSE, FALSE, NA, TRUE, FALSE, 
NA, FALSE, NA, TRUE, FALSE, NA, NA, FALSE, FALSE, FALSE, NA, 
TRUE, NA, FALSE, FALSE, NA, TRUE, FALSE, NA, FALSE, FALSE, NA, 
TRUE, FALSE, FALSE, FALSE, NA, NA, NA, NA, FALSE, FALSE, NA, 
NA, TRUE, NA, NA, NA, NA, NA, FALSE, NA, NA, TRUE, TRUE, NA, 
NA, NA, FALSE, NA, NA, NA, NA, NA, FALSE, TRUE, NA, FALSE, NA, 
NA, FALSE, NA, FALSE, TRUE, FALSE, FALSE, TRUE, NA, FALSE, NA, 
NA), d = c(NA, FALSE, FALSE, FALSE, FALSE, NA, NA, NA, FALSE, 
FALSE, FALSE, FALSE, NA, FALSE, NA, FALSE, FALSE, TRUE, FALSE, 
FALSE, FALSE, NA, FALSE, NA, FALSE, FALSE, FALSE, NA, FALSE, 
FALSE, NA, TRUE, NA, FALSE, FALSE, NA, NA, NA, NA, FALSE, NA, 
NA, NA, NA, FALSE, FALSE, TRUE, NA, NA, NA, FALSE, NA, NA, FALSE, 
NA, FALSE, FALSE, NA, FALSE, FALSE, NA, NA, NA, NA, FALSE, NA, 
FALSE, NA, NA, NA, FALSE, TRUE, FALSE, NA, FALSE, NA, NA, FALSE, 
FALSE, TRUE, NA, FALSE, FALSE, FALSE, NA, NA, FALSE, NA, FALSE, 
NA, TRUE, NA, NA, NA, NA, FALSE, NA, FALSE, TRUE, FALSE, FALSE, 
NA, FALSE, FALSE, NA, FALSE, NA, FALSE, FALSE, NA, NA, FALSE, 
FALSE, FALSE, NA, FALSE, NA, FALSE, FALSE, NA, TRUE, FALSE, NA, 
FALSE, FALSE, NA, FALSE, FALSE, FALSE, FALSE, NA, NA, NA, NA, 
TRUE, FALSE, NA, NA, FALSE, NA, NA, NA, NA, NA, FALSE, NA, NA, 
FALSE, FALSE, NA, NA, NA, FALSE, NA, NA, NA, NA, NA, FALSE, FALSE, 
NA, FALSE, NA, NA, FALSE, NA, FALSE, FALSE, FALSE, FALSE, FALSE, 
NA, TRUE, NA, NA))

我想要一个函数,当原始向量中的任何对应值为 TRUE (output_vector) 时,该函数将 return 具有 TRUE 值的逻辑向量。 当出现以下任何情况时:(mylist[[1]][[i]], mylist[[2]][[i]], mylist[[3]][[i]], mylist[[4]][ [i]]) 为真,output_vector[i] 应为真。

我想到了两种解决方案,一种是嵌套 for 循环,另一种是 mapply:

#嵌套for循环:

my_function<-function(){
        my_vector<-logical(length(mylist[[1]]))
        for (i in 1:length(mylist[[1]])){
                for (j in 1:length(mylist)){
                        my_vector[i]<-any(mylist[[j]][[i]]==T)
                }
        }
my_vector
}

my_function()

映射:


mapply(any, mylist[[1]], mylist[[2]], mylist[[3]], mylist[[4]])

我很惊讶,因为: 1-) #mapply 和 #nested for 循环方法产生了不同的结果

也许嵌套的for循环方法有问题?不过,mapply 看起来更干净,使用效果也符合我的预期。

奖金问题:有没有办法在 mapply 方法中使用某种 do.call(),这样我就不必写出任何参数到 any()?

如果我们需要逐元素比较,使用Reduce

out1 <- Reduce(`|`, mylist)

这类似于 do.call 方法 Mapany

out2 <- unlist(do.call(Map, c(f = any, mylist)))
all.equal(out1, out2)
#[1] TRUE

在嵌套的for循环中

mylist[[j]][[i]]

list 中的单个元素,它被 any 包裹起来。因此,被初始化为 'mylist' 的第一个 vector 元素的 lengthmy_vector 正在被回收,它将 return 最后一个 list元素

如果我们在 function for 循环中做一个小改动,它会给出相同的输出,即关键是检查 'my_vector' 中的元素是否在相同的位置连同从 'mylist' 索引的元素具有 any TRUE 值,而不是仅检查单个元素并将其覆盖为 my_vector

 my_function<-function(){
         my_vector <- logical(length(mylist[[1]]))
         for (i in 1:length(mylist[[1]])){
                 for (j in 1:length(mylist)){
                         my_vector[i] <- any(c(my_vector[i], mylist[[j]][[i]]))
                 }
         }
       my_vector
 }

 out3 <- my_function()
identical(out1, out3)
#[1] TRUE

这是另一个可能适用于您的问题的基本 R 选项

colSums(do.call(rbind,mylist))>1

计算列中 TRUE 的数量。如果存在 NA,则返回 NA