在这个网站上的人的帮助下,我有一个类似于此的矩阵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
) ?
答案 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