如何向矩阵中的每一行添加一个随机选择的值作为新列?

3

首先声明一下,我是一个 R 语言新手,可能这个问题有很简单的解决方法,但我一直在苦苦寻找。

我有一个包含 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中创建这样一个变量?我不需要它在矩阵内部创建。提前感谢您的帮助。
2个回答

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

@tex,欢迎您,需要解决编程问题时请回到stackoveflow.com =) - Max
2
@teh,如果你认为任何一个答案解决了你的问题,请在你最喜欢的答案下方点击灰色勾号。 - Roman Luštrik
1
@Joshua Ulrich:我在紧凑性比赛中显然输了。但是我在时间性能方面仍然领先。 - IRTFM
@DWin,你的时间性能回复很好。事实上,在我的解决方案中应用是瓶颈。所以,这是一个抉择:你赢得了时间性能,我赢得了紧凑性能 :) - Max
@Joshua Ulrich:我认为Max的方法在编程中更加清晰易懂,这一点非常重要。我的最爱是使用逻辑索引连接的方法,但需要在脑海中想象矩阵的展开和折叠。这对于想要理解矩阵操作的人可能有所帮助,但仍然有些费解。 - IRTFM
显示剩余2条评论

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接