在这个网站上的人的帮助下,我有一个y类似于此的矩阵(但更简化).
1,3
1,3
1,3
7,1
8,2
8,2
Run Code Online (Sandbox Code Playgroud)
我创建了第三列生成随机数(不使用此代码替换每个重复块)j=cbind(y,sample(1:99999,y[,2],replace=FALSE)).
Matrix j看起来像这样:
1,3,4520
1,3,7980
1,3,950
7,1,2
8,3,4520
8,3,7980
8,3,950
Run Code Online (Sandbox Code Playgroud)
如何为我的第三列获得真正的随机数,使得对于每个重复行,即3,然后是1,然后2,我得到一个未在该重复部分(replace = FALSE)内复制的随机数?
为什么会这样:
问题是sample命令结构是:
sample(vector of values, how many?, replace = FALSE or TRUE)
Run Code Online (Sandbox Code Playgroud)
在这里,"有多少?" 应该是一个值.由于您提供了第二列的全部内容y,因此它只选择第一个值,3因此它读取为:
set.seed(45) # just for reproducibility
sample(1:99999, 3, replace = F)
Run Code Online (Sandbox Code Playgroud)
对于这个种子,价值观是:
# [1] 63337 31754 24092
Run Code Online (Sandbox Code Playgroud)
而且由于只有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
Run Code Online (Sandbox Code Playgroud)
看到值重复.对于你所展示的矩阵,我不知道它是如何7,1,2发生的.作为矩阵的第一个值y[,2] = 3.
你应该做什么:
y <- cbind(y, sample(1:99999, nrow(y), replace = FALSE))
Run Code Online (Sandbox Code Playgroud)
这要求sample生成nrow(y) = 6(此处)值而不替换.这将产生长度为6的不相同的值,并且将被绑定到矩阵y.