2016-08-14 68 views
-1

如果有來計算R.中的R矩陣的任意兩個列之間的相同元件

一個矩陣中的任意兩個列之間的相同元件的最大數目對於一個簡單的方法我只是想知道的最大數目例如,我有一個矩陣

test <- replicate(10, sample((0:3), 10, replace = TRUE)) 

test 

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] 3 0 1 0 2 2 1 0 2  0 
[2,] 1 1 3 2 0 2 3 0 2  2 
[3,] 2 3 0 0 1 2 0 3 0  2 
[4,] 2 2 1 1 2 0 0 1 1  0 
[5,] 2 0 1 2 0 1 1 1 0  0 
[6,] 1 0 1 3 2 3 3 1 3  2 
[7,] 0 1 3 2 1 0 1 2 1  1 
[8,] 0 3 1 3 0 2 3 1 1  1 
[9,] 2 3 1 3 0 1 0 1 3  2 
[10,] 3 2 1 0 2 1 3 2 3  1 

比較列1和2 I使用

table(test[,1] == test[,2]) 

FALSE TRUE 
    8  2 

所以有這兩列之間的兩個相同的元件。

我現在可以用兩個嵌套的for循環重複這個對所有列對,然後找到真正的最大呼叫數量,但是這並不好看。任何人都可以想出更好的方法嗎?

乾杯,

MAIK

+0

試試'combn(ncol(test),2,FUN = function(x)sum(test [,x [1]] == test [,x [2]]))'也許 –

回答

2

嘗試:

max(combn(split(test, col(test)), 2, function(x) sum(x[[1]] == x[[2]]))) 

如果你想知道哪些對具有相同元的最大數量這是一個稍微複雜一點。

+0

@DavidArenburg相信它或不是我沒有。在發佈我的答案之前,我看到了您的評論,但我仍然決定發佈它。 –

3

總是很有趣看到一個合理的答案被否決。雖然我不喜歡這個減得分,但我會保留我的答案。選民,你覺得怎麼樣?


讓我們先得到一些重複性玩具數據:

set.seed(0); x <- replicate(10, sample((0:3), 10, replace = TRUE)) 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
# [1,] 3 0 3 1 1 2 1 3 3  0 
# [2,] 1 0 3 1 3 1 3 1 1  0 
# [3,] 1 0 0 2 2 3 1 3 2  0 
# [4,] 2 2 2 1 3 1 1 1 1  2 
# [5,] 3 1 0 0 2 0 1 1 1  3 
# [6,] 0 3 1 3 2 0 2 1 3  3 
# [7,] 3 1 1 2 3 0 1 3 0  3 
# [8,] 3 2 0 3 0 1 1 3 2  1 
# [9,] 2 3 1 0 1 2 3 1 0  1 
#[10,] 2 1 3 2 2 2 0 3 0  3 

對於任何輸入矩陣x,你可以使用:

y <- unlist(lapply(seq_len(ncol(x)-1L), 
        function(i) colSums(x[, (i+1):ncol(x), drop = FALSE] == x[, i]))) 
# [1] 1 2 3 2 4 1 4 2 3 3 1 0 0 3 1 3 5 1 3 1 2 4 1 4 3 4 2 3 5 1 1 3 2 1 2 2 3 3 
#[39] 1 2 3 1 4 3 1 
max(y) 
# [1] 5 

通過@大衛的意見基本上是做同樣的事情,但方法要慢:

y <- combn(ncol(x), 2, FUN = function(u) sum(x[, u[1]] == x[, u[2]])) 
# [1] 1 2 3 2 4 1 4 2 3 3 1 0 0 3 1 3 5 1 3 1 2 4 1 4 3 4 2 3 5 1 1 3 2 1 2 2 3 3 
#[39] 1 2 3 1 4 3 1 
max(y) 
# [1] 5 

標杆

我們生成實驗有10×1000矩陣:

set.seed(0); x <- replicate(1e+3, sample((0:3), 10, replace = TRUE)) 
system.time(unlist(lapply(seq_len(ncol(x)-1L), function(i) colSums(x[, (i+1):ncol(x), drop = FALSE] == x[, i])))) 
# user system elapsed 
# 0.176 0.032 0.207 
system.time(combn(ncol(x), 2, FUN = function(u) sum(x[, u[1]] == x[, u[2]]))) 
# user system elapsed 
# 4.692 0.008 4.708 

像一個距離矩陣?

有了這樣的想法,你也可以生成的所有列之間不等於元素數量「距離」矩陣(只是!=更換==):

y <- unlist(lapply(seq_len(ncol(x)-1L), 
        function(i) colSums(x[, (i+1):ncol(x), drop = FALSE] != x[, i]))) 
z <- matrix(0L, ncol(x), ncol(x)) 
z[lower.tri(z)] <- y 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
# [1,] 0 0 0 0 0 0 0 0 0  0 
# [2,] 9 0 0 0 0 0 0 0 0  0 
# [3,] 8 7 0 0 0 0 0 0 0  0 
# [4,] 7 9 9 0 0 0 0 0 0  0 
# [5,] 8 10 7 7 0 0 0 0 0  0 
# [6,] 6 10 9 6 9 0 0 0 0  0 
# [7,] 9 7 8 8 7 8 0 0 0  0 
# [8,] 6 9 6 7 8 7 8 0 0  0 
# [9,] 8 7 9 5 9 7 7 6 0  0 
#[10,] 7 5 6 9 8 9 9 7 9  0 

注意只由於對稱性,計算下三角矩陣。對角線全部爲零(或當然)。

相關問題