【问题标题】:R: How to add a column with a randomly chosen value from each row of a matrix?R:如何从矩阵的每一行中添加具有随机选择值的列?
【发布时间】:2011-11-08 05:43:54
【问题描述】:

我会先说我是 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

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

非常感谢。

【问题讨论】:

    标签: r random


    【解决方案1】:
    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
    

    【讨论】:

    • @Max 非常感谢您的快速回复 :) 就像一个魅力!
    • @DWin,是的,有点,48 = nchar(my_variant)
    • @tex,不客气,需要解决的时候回到stackoveflow.com。编程 =)
    • @teh,如果您认为任何答案解决了您的问题,请点击您最喜欢的答案下方的灰色勾号。
    • @Joshua Ulrich:我显然已经输掉了紧凑度竞赛。但我仍然在按时赢得比赛。
    【解决方案2】:
    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
    

    【讨论】:

      最近更新 更多