我将在前言中说我是一个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中创建这样的变量?我不一定需要在矩阵本身内创建它。
非常感谢提前。
答案 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