簡體   English   中英

為什么 all.equal 不能在向量列表中找到我的向量?

[英]Why won't all.equal find me a vector in a list of vectors?

我正在嘗試編寫一些代碼以在大量向量中查找特定向量並返回該向量副本出現位置的索引。 在嘗試調試時,我正在嘗試學習all.equal的行為(在此處推薦, identical似乎被類型不匹配排除)。 我現在寫了以下代碼:

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

據我了解,我所寫的第一行生成了大量從 1 到 4 的整數排列,第二行在它們中搜索精確排列 1、2、3、4 的任何場合。從統計學上講,我非常有信心這個排列應該出現在這個列表的某個地方,在我的特殊情況下,它是第九個條目。 但是,每次我運行此代碼或其任何變體時,我都被告知所需的排列永遠不會出現。

我究竟做錯了什么? 坦率地說,當我不得不查找如何在向量列表中查找向量時,我開始懷疑自己犯了一個重大錯誤,並且我必須使用兩個函數才能做到這一點。 有沒有更簡單的方法?

實際上,您幾乎就在那里,這只是一個小錯字。 正確的代碼是

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

因為您需要提供數據進行比較,而必要的數據是列而不是整個數據集。 你這樣做的方式,它永遠不會找到匹配項,因為整個數組永遠不會匹配一個向量。

試試這個:

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

不同之處在於,在您的代碼中,您將名為data的整個結構與 1:4 進行比較,這永遠不會是TRUE ,因為大小不匹配。 我用正在應用的 function 內部的x替換了data ,因此現在將每個單獨的列與 1:4 進行比較。

您的代碼中也有一些冗余, c(1:4)1:4相同。 在這種情況下all.equal可能是矯枉過正,因為它所做的不僅僅是比較(它與一個模糊因子進行比較,並告訴你事情有什么不同)。 您使用它的方式是將TRUE轉換為字符。 不提前簡化會更有效。 這是一個快速比較(較小的模擬數據):

> 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 

簡化代碼的運行時間約為九分之一(平均)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM