【问题标题】:corresponding comparison of vectors within a list in RR中列表中向量的相应比较
【发布时间】:2020-12-27 20:40:38
【问题描述】:

我有一个包含 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) 时,该函数将返回具有 TRUE 值的逻辑向量。 当以下任何一种情况:(mylist[[1]][[i]]、mylist[[2]][[i]]、mylist[[3]][[i]]、mylist[[4]][ [i]]) 为 TRUE,output_vector[i] 应为 TRUE。

我想出了两种解决方案,一种是嵌套的 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() 的每个参数?

【问题讨论】:

  • mapply 进行了相应的比较。你想在for循环中进行比较
  • 嗨@akrun,我想要一个相应的比较。我在 for 循环中弄错了吗?
  • 你对应的比较是unlist(do.call(Map, c(f = any, mylist)))而不是指定每个元素
  • 好的,谢谢@akrun。我看到您的方法产生的结果与我的 mapply 方法完全相同。我的方式有什么不好的做法吗?不太清楚为什么我需要调用 unlist() 和 map()
  • 使用mapply,参数默认为SIMPLIFY = TRUE,因此它可能会强制转换为矩阵或保持为list,这取决于Map,我们可以确定它总是返回一个list

标签: r for-loop mapply


【解决方案1】:

如果我们需要逐元素比较,请使用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正在被回收,它将返回最后一个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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 2018-07-28
      • 2015-03-15
      • 1970-01-01
      相关资源
      最近更新 更多