R:如何从矩阵的每一行添加一个随机选择的值的列?

时间:2011-11-08 05:43:55

标签: r random

我将在前言中说我是一个R菜鸟,我认为这可能有一个简单的解决方案,但我很难找到它。

我有一个包含2列和1,000行的矩阵。保持行固定,我想创建一个新变量,随机选择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

在上面的简化矩阵中,第3列(我刚刚手工添加)只包含来自相应行中任一先前列的随机元素。我的问题是,我如何在R中创建这样的变量?我不一定需要在矩阵本身内创建它。

非常感谢提前。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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