2012-11-07 101 views
0

我正在通過二項式概率表達式在矩陣中添加一些值。問題是我有一些需要保留在矩陣中的NA值,但是當輸入NA時,rbinom()會返回一個錯誤。R,rbinom(),NA和矩陣:如何忽略NA並保留它們

我的算法由以下內容組成:

  • (1)的值在一列的矩陣開始。
  • (2)在該矩陣中加倍 值。 (3)從二項式中選擇一個隨機值,其概率爲0.5。
  • ...做更多的事情是uneccessary

這裏是一個重複的例子。

set.seed(10) 
xn <- matrix(c(NA, 100, 100, 100, 100, NA, NA, 100, 100, NA), byrow=TRUE, ncol=2) 
dup <- xn * 2 
z <- matrix(rbinom(n=rep(1,length(dup)), size = as.vector(dup), prob = 0.5), nrow = nrow(dup)) 
Warning message: 
In rbinom(n = rep(1, length(dup)), size = as.vector(dup), prob = 0.5) : 
    NAs produced 

我想過只選擇矩陣中具有實際值的值。

set.seed(6) 
xn_bin <- rbinom(n=rep(1,length(dup[-which(is.na(dup))])), size = as.vector(dup[-which(is.na(dup))]),prob = 0.5) 

我不知道怎麼去矩陣一起回來,因爲我需要採取從xn_bin結果,並把它們放回相同的位置在一個新的矩陣作爲DUP值位於輸入到rbinom() 。

如果這沒有任何意義。 xn_bin會給值: xn_bin [1] 101 115 112 98 103 103

DUP會給:

dup 
    [,1] [,2] 
[1,] NA 200 
[2,] 200 200 
[3,] 200 NA 
[4,] NA 200 
[5,] 200 NA 

我想要的最終矩陣具有從xn_bin值和NA從XN值:

  [,1] [,2] 
[1,] NA 101 
[2,] 115 112 
[3,] 98 NA 
[4,] NA 103 
[5,] 103 NA 

任何想法如何有效地做到這一點?

回答

0

請注意,順序是不一樣的,但在矩陣結構中的位置是所需的,因爲這是一個隨機過程,不應該由位置確定,我不明白爲什麼這個結果不如您的排序( R矩陣由列而不是按行填充):

xn_bin <- z 

set.seed(6) 
xn_bin[ !is.na(z) ] <- rbinom(n=rep(1,length(dup[-which(is.na(dup))])), 
           size = as.vector(dup[-which(is.na(dup))]),prob = 0.5) 
xn_bin 
    [,1] [,2] 
[1,] NaN 98 
[2,] 101 103 
[3,] 115 NaN 
[4,] NaN 103 
[5,] 112 NaN 
+0

是否可以按行排列?每列代表人口的增長,而每行代表不同人口的重複。因此,如果按列排序,那麼這些值將在不同的羣體之間混合起來。 – Kevin

+0

另外,什麼是z定義爲?在我的例子中,它沒有被定義爲產生錯誤。 – Kevin

+0

第一個問題:處理順序和R矩陣是沿着列的,所以我相信我的排序是正確的,你的錯誤。第二個問題:你定義了'z'。 ???我只是把它的副本放在正確位置的值的佔位符。 –