R中列表内向量的对应比较

R中列表内向量的对应比较,r,for-loop,mapply,R,For Loop,Mapply,我的列表中有4个逻辑向量: 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, FAL

我的列表中有4个逻辑向量:

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))
我想要一个函数,当原始向量的任何对应值为真输出向量时,该函数将返回一个带有真值的逻辑向量。 当下列任一项为真时:mylist[[1][[i]]、mylist[[2]][[i]]、mylist[[3]][[i]]、mylist[[4]][[i]],则输出向量[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()

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

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


附加问题:有没有一种方法可以在mapply方法中使用某种do.call,这样我就不必写出任何参数?

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

在嵌套for循环中

是列表中的单个元素,该元素将被任何。因此,被初始化为“mylist”的第一个向量元素的长度的my_向量正在被回收,它将返回最后一个列表元素的输出

如果我们在for loop函数中做一个小的更改,它将给出相同的输出,即关键是检查“my_vector”中的元素以及从“mylist”索引的元素是否具有任何真值,而不是只检查单个元素并将其覆盖到my_vector


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

在嵌套for循环中

是列表中的单个元素,该元素将被任何。因此,被初始化为“mylist”的第一个向量元素的长度的my_向量正在被回收,它将返回最后一个列表元素的输出

如果我们在for loop函数中做一个小的更改,它将给出相同的输出,即关键是检查“my_vector”中的元素以及从“mylist”索引的元素是否具有任何真值,而不是只检查单个元素并将其覆盖到my_vector


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

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

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

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

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

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

使用mapply进行相应的比较。你想要一个比较吗?在for loopHi@akrun中,我想要一个对应的比较。我在for循环中弄错了吗?相应的比较是unlistdo.callMap,cf=any,mylist,而不是指定每个元素OK thank you@akrun。我看到你的方法产生的结果和我的mapply方法完全相同。有什么不好的习惯妨碍我吗?我不太清楚为什么我需要调用unlist和mapWith-mapply,默认情况下参数是SIMPLIFY=TRUE,因此它可能强制为矩阵或保留为列表,这取决于映射时,我们可以确定它总是返回一个listWith-mapply,您正在做相应的比较。你想要一个比较吗?在for loopHi@akrun中,我想要一个对应的比较。我在for循环中弄错了吗?相应的比较是unlistdo.callMap,cf=any,mylist,而不是指定每个元素OK thank you@akrun。我看到你的方法产生的结果和我的mapply方法完全相同。有什么不好的习惯妨碍我吗?我不太清楚为什么我需要调用unlist和mapWith-mapply,默认情况下参数是SIMPLIFY=TRUE,因此它可能强制为一个矩阵或保留为一个列表,这取决于Map,我们可以确定它总是返回一个列表
out2 <- unlist(do.call(Map, c(f = any, mylist)))
all.equal(out1, out2)
#[1] TRUE
mylist[[j]][[i]]
 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
colSums(do.call(rbind,mylist))>1