2016-10-03 72 views
1

我正在尋找解決以下問題的方法 - 必須有一個簡單的答案!識別並替換二進制矩陣列表中的所有sum-to-zero行

我有一個二進制矩陣的列表,我想確定每個矩陣的所有行,其中該行上的每個元素爲零(=行總和爲零),然後用1替換該行上的每個元素/ NcoI位(DF)。每個矩陣具有相同的行數但列數不同。我的最終數據集將有超過5000個矩陣!

因此,像這樣:

 a  b  c 
abc 0  1  0 
def 0  0  1 
ghi 0  0  0 
jkl 1  0  0 

成爲:

 a b c 
abc 0 1 0 
def 0 0 1 
ghi 0.33 0.33 0.33 
jkl 1 0 0 

謝謝!

回答

1

對於單個矩陣A,可以做

A[!rowSums(A), ] <- 1/ncol(A) 

A <- structure(c(0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0), .Dim = c(4L, 4L)) 

#  [,1] [,2] [,3] [,4] 
#[1,] 0 0 0 1 
#[2,] 0 1 1 0 
#[3,] 1 0 0 1 
#[4,] 0 0 0 0 

上面的代碼得到:

#  [,1] [,2] [,3] [,4] 
#[1,] 0.00 0.00 0.00 1.00 
#[2,] 0.00 1.00 1.00 0.00 
#[3,] 1.00 0.00 0.00 1.00 
#[4,] 0.25 0.25 0.25 0.25 

當你有矩陣的列表,說lst,你可以lapply通過清單:

lapply(lst, function (A) {A[!rowSums(A), ] <- 1/ncol(A); return(A)})