2011-11-08 58 views
3

我會在前言中說我是一個R noob,我認爲這可能有一個簡單的解決方案,但我努力尋找它。R:如何在矩陣的每一行添加一個隨機選擇的值的列?

我有2列1000行的矩陣。保持行固定,我想創建一個新的變量,隨機選擇2列中的一個元素。例如,使一個簡單的矩陣:

 matrix(c(1,1,4,6,1,3,2,1,1,7), ncol=2) 

     [,1] [,2] [,3] 
    [1,] 1 3 3 
    [2,] 1 2 1 
    [3,] 4 1 4 
    [4,] 6 1 1 
    [5,] 1 7 7 

在上述簡化矩陣,所述第三列(我剛手工添加的)只包含來自任一現有列的對應行中的隨機元素。我的問題是,我將如何在R中創建這樣一個變量?我不一定需要在矩陣本身內創建它。

非常感謝提前。

回答

8
t <- matrix(c(1,1,4,6,1,3,2,1,1,7), ncol=2) 
cbind(t,apply(t,1,function(x) sample(x,size=1))) 

     [,1] [,2] [,3] 
[1,] 1 3 1 
[2,] 1 2 2 
[3,] 4 1 4 
[4,] 6 1 1 
[5,] 1 7 1 
+0

比我的更緊湊。 –

+0

@Max非常感謝您的回覆:)作品像一個魅力! – teh

+0

@DWin,是的,有點,48 = nchar(my_variant)<77 = nchar(your_variant)=) – Max

5
cbind(mat, mat[cbind(1:NROW(mat), sample(1:2, NROW(mat), replace=TRUE)) ]) 

    [,1] [,2] [,3] 
[1,] 1 3 1 
[2,] 1 2 2 
[3,] 4 1 4 
[4,] 6 1 1 
[5,] 1 7 1 

臨屋上述方法使用由1取樣:2沿分度矩陣的一列。下面是一個方法,沿着第一列進行採樣,然後從第二列中選取剩餘的行。如果這些結構很大或者在模擬練習中需要多次重複,這些可能會更快:

idx<-sample(c(TRUE,FALSE), prod(dim(mat))/2, replace=TRUE) # a 5 element logic vector 
cbind(mat, mat[ c(idx, !idx)]) # using the idx and negation of the idx 
    [,1] [,2] [,3] 
[1,] 1 3 1 
[2,] 1 2 2 
[3,] 4 1 1 
[4,] 6 1 1 
[5,] 1 7 7 
相關問題