R使用样本创建具有随机数的矩阵列

时间:2013-03-01 17:23:33

标签: r matrix

在这个网站上的人的帮助下,我有一个类似于此的矩阵y(但更简化)。

1,3
1,3
1,3
7,1
8,2
8,2

我创建了第三列生成随机数(不使用此代码j=cbind(y,sample(1:99999,y[,2],replace=FALSE))替换每个重复块。

矩阵j如下所示:

1,3,4520
1,3,7980
1,3,950
7,1,2
8,3,4520
8,3,7980
8,3,950

如何为我的第三列获取真正的随机数,使得对于每个重复行,即3,然后是1,然后是2,我得到一个未在该重复部分内复制的随机数(replace = FALSE) ?

3 个答案:

答案 0 :(得分:5)

为什么会发生这种情况:

问题是sample命令结构是:

sample(vector of values, how many?, replace = FALSE or TRUE)

这里,“有多少?”应该是一个值。由于您提供了y的第二列的全部内容,因此它只选择3的第一个值,因此读取为:

set.seed(45) # just for reproducibility
sample(1:99999, 3, replace = F)

对于这个种子,值是:

# [1] 63337 31754 24092

由于只有3个值,你将它与6行的矩阵绑定,它会“循环”这些值(意思是,它以相同的顺序重复这些值)。所以,你得到:

#      [,1] [,2]  [,3]
# [1,]    1    3 63337
# [2,]    1    3 31754
# [3,]    1    3 24092
# [4,]    7    1 63337
# [5,]    8    2 31754
# [6,]    8    2 24092

看到值重复。对于你已经显示的矩阵,我不知道7,1,2是如何发生的。作为y[,2] = 3中矩阵的第一个值。

你应该做什么:

y <- cbind(y, sample(1:99999, nrow(y), replace = FALSE))

这要求sample生成nrow(y) = 6(此处)值而不替换。这将产生长度为6的不相同的值,并且将被绑定到矩阵y

答案 1 :(得分:1)

这可以让你得到你想要的东西:

j <- cbind(y, unlist(sapply(unique(y[,2]), function(n) sample(1:99999, n))))

编辑:代码中出错。当然需要函数unique

答案 2 :(得分:1)

没有循环,我无法得到这个。也许别人可以得到更优雅的解决方案。对我来说,问题是在组内重复采样而不重复组间

ll <- split(dat, paste(dat$V1,dat$V2,sep=''))
ll.length <- by(dat, paste(dat$V1,dat$V2,sep=''),nrow)
z <- rep(0,nrow(dat))  

SET <- seq(1,100)  ## we can change 100 by 99999 for example
v =1
for (i in seq_along(ll)){
  SET <- SET[is.na(match(z,SET))]
  nn   <- nrow(ll[[i]]) 
  z[v:(v+nn-1)] <- sample(SET,nn,rep=TRUE) 
  v <- v+nn
}

 z
[1]  35  77  94 100  23  59