2013-12-14 39 views
3

我正在處理一大組組合。我想要一種方法來消除它們中的一部分,從而消除元素靠近在一起的所有組合(其中,由我設定的靠近)。 (請注意,它可能需要一兩秒鐘,這是相當大的)。r檢查行元素是否在界限內

讓我們做出了榜樣:

library(gtools) 

support<-matrix(seq(0,1,by=0.1), ncol=1) 
support.n<-as.matrix(permutations(length(support), 3,support)) 

但現在我想消除所有行,任何2名的組合是「關閉」(比如內的對方,包容+/- 0.2)。也就是說,我怎麼轉換:

... 
[964,] 1.0 0.7 0.0 
[965,] 1.0 0.7 0.1 
[966,] 1.0 0.7 0.2 
[967,] 1.0 0.7 0.3 
[968,] 1.0 0.7 0.4 
[969,] 1.0 0.7 0.5 
[970,] 1.0 0.7 0.6 
[971,] 1.0 0.7 0.8 
[972,] 1.0 0.7 0.9 
[973,] 1.0 0.8 0.0 
[974,] 1.0 0.8 0.1 
[975,] 1.0 0.8 0.2 
[976,] 1.0 0.8 0.3 
[977,] 1.0 0.8 0.4 
[978,] 1.0 0.8 0.5 
[979,] 1.0 0.8 0.6 
[980,] 1.0 0.8 0.7 
[981,] 1.0 0.8 0.9 
[982,] 1.0 0.9 0.0 
[983,] 1.0 0.9 0.1 
[984,] 1.0 0.9 0.2 
[985,] 1.0 0.9 0.3 
[986,] 1.0 0.9 0.4 
[987,] 1.0 0.9 0.5 
[988,] 1.0 0.9 0.6 
[989,] 1.0 0.9 0.7 
[990,] 1.0 0.9 0.8 

到薄得多:

.... 
[964,] 1.0 0.7 0.0 
[965,] 1.0 0.7 0.1 
[966,] 1.0 0.7 0.2 
[967,] 1.0 0.7 0.3 
[968,] 1.0 0.7 0.4 
[969,] 1.0 0.7 0.5 

其中行名稱是不正確的,因爲我沒有計算出發生了什麼給他們。 我一直在看任何(x)的命令,以及一些各種哪些()類型的命令,但似乎無法得到發生的魔法。

回答

0

這應該適合你。 xsupport.n的每一行的別名,每對組合是從行元素創建的,每對之間的最小絕對差異是針對0.2進行檢查的。它返回一個TRUE/FALSE,然後用來support.n子集 -

support.n[ 
    apply(
    support.n, 
    1, 
    function(x) 
     min(
     abs(
      diff(
      combn(
       x, 
       2 
      ) 
      ) 
     ) 
     ) 
    ) > 0.2, 
    ] 
+0

一段時間的測試後,我發現codoremifia的答案的運行速度比尼爾·富爾茨的回答快幾乎25%(十秒)。我覺得這很了不起,因爲它包含了一些額外的命令,我認爲它們會變慢。有人知道爲什麼 – RegressForward

1

我想codoremifa和我在同一頁上這裏。我們的答案使用相同的邏輯併爲您的樣本數據提供相同的值。這是我放在一起:

f <- function(x, threshold = .2) { 
combinations <- combn(length(x),2) 
keep <- all(abs(x[combinations[1,]] - x[combinations[2,]]) > threshold) 
return(keep) 
} 

然後apply功能f,由行,創建TRUE/FALSE值的指標來選擇support.n相應行:

a <- support.n[apply(support.n, 1,f),] 

爲了證實我們的答案是的同樣,我保存了codoremifa的答案爲b

> all.equal(a,b) 
[1] TRUE 

對於大型物體, ms行數或列數,您可以通過提前完成並簡單地將其索引到每行中來消除每行計算combn()的開銷。然而這個例子在我的機器上運行了0.05秒,所以這裏不值得做一個更復雜的功能。

0

我的答案也很相似,給出了相同的答案。我不認爲combn()的東西真的有必要,而不是我只想排序每一行,而不是走的了diff

support.n[ apply(support.n, 1, function(x) all(diff(sort(x)) > .2)) , ]