【问题标题】:Why won't all.equal find me a vector in a list of vectors?为什么 all.equal 不能在向量列表中找到我的向量?
【发布时间】:2020-07-16 03:58:05
【问题描述】:

我正在尝试编写一些代码以在大量向量中查找特定向量并返回该向量副本出现位置的索引。为了调试,我试图了解all.equal 的行为(推荐hereidentical 似乎被类型不匹配排除)。我现在写了以下代码:

data<-replicate(100000,sample(4)) 
which( apply(data, 2, function(x) all.equal(c(1:4),data)) == TRUE)

据我所知,我所写的第一行代码生成了大量从 1 到 4 的整数排列,第二行在它们中搜索任何确切排列为 1、2、3、4 的情况. 从统计上讲,我非常有信心这个排列应该出现在这个列表中的某个地方,在我的特殊情况下,它是第九个条目。但是,每次我运行此代码或对其进行任何变体时,都会被告知所需的排列永远不会出现。

我做错了什么?坦率地说,当我不得不查找如何在向量列表中查找向量时,我开始怀疑自己犯了一个重大错误,并且我必须使用两个函数来做到这一点。有没有更简单的方法?

【问题讨论】:

    标签: r vector match permutation


    【解决方案1】:

    试试这个:

    which( apply(data, 2, function(x) all.equal(c(1:4),x)) == TRUE)
    

    不同之处在于,在您的代码中,您将名为 data 的整个结构与 1:4 进行比较,这永远不会是 TRUE,因为大小不匹配。我在正在应用的函数内部将data 替换为x,所以现在每个单独的列都与1:4 进行比较。

    您的代码中也有一些冗余,c(1:4)1:4 相同。而all.equal 在这种情况下可能有点矫枉过正,因为它所做的不仅仅是比较(它与一个模糊因子进行比较,并告诉你事情有什么不同)。您使用它的方式是将TRUEs 转换为字符。不提前简化会更有效率。这是一个快速比较(较小的模拟数据):

    > library(microbenchmark)
    > 
    > microbenchmark(
    +   ae = {
    +     data<-replicate(100,sample(4)) 
    +     which( apply(data, 2, function(x) all.equal(c(1:4),x)) == TRUE)
    +   },
    +   e = {
    +     data <- replicate(100, sample(4), simplify=FALSE)
    +     which(sapply(data, function(x)all(x==(1:4))))
    +   }
    + )
    Unit: microseconds
     expr      min        lq      mean    median       uq       max neval cld
       ae 4063.205 4303.3370 4940.2126 4501.5080 4951.623 10953.339   100   b
        e  455.934  493.3115  578.4828  523.4605  562.601  2013.444   100  a 
    

    简化代码的运行时间大约为九分之一(平均)。

    【讨论】:

    • 你是如何用 sapply 删除 (data, 2,) 部分的? sapply 不需要知道它只查看列吗?
    • @J.Mini,在带有sapply 的代码中,我在对replicate 的调用中指定了simplify=FALSE。结果是replicate 返回一个列表而不是矩阵,sapply 直接在列表上工作。部分加速可能是跳过replicate 将列表转换为矩阵的步骤。
    【解决方案2】:

    实际上,您几乎就在那里,这只是一个小错字。正确的代码是

    which(apply(data, 2, function(x) all.equal(x, c(1, 2, 3, 4))) == TRUE)
    

    因为您需要提供数据进行比较,而必要的数据是列而不是整个数据集。你这样做的方式,它永远不会找到匹配项,因为整个数组永远不会匹配一个向量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 2011-02-17
      • 1970-01-01
      • 2015-03-31
      • 2011-03-18
      • 1970-01-01
      相关资源
      最近更新 更多