2

在这个网站上的人的帮助下,我有一个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) 中未复制的随机数?

4

3 回答 3

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 的不相同的值,并将绑定到您的 matrix y

于 2013-03-01T17:32:52.733 回答
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
于 2013-03-01T19:09:13.157 回答
1

这应该可以得到你想要的:

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

编辑:代码中有错误。当然需要功能unique

于 2013-03-01T18:41:36.280 回答