2013-03-01 145 views
2

在此站点上的人的帮助下,我有一个矩阵y,看起来与此类似(但更简化)。 。R使用示例创建随机数矩阵列

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

对不起来样,你似乎给我们留下了评论,并删除了它。你能再写一遍吗?我明白我的答案似乎并不是你想要的。 – Arun 2013-03-01 18:54:05

回答

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

这应该得到你想要的东西:

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

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

+0

我很抱歉,但我不明白这一点。我在这里也获得了6个独特的值。这和'sample(1:99999,6)'完全不同吗? – Arun 2013-03-01 18:56:34

+0

利用提供的示例数据,唯一(y [,2])是c(3,1,2)。现在使用sapply,您首先从1:99999,然后是1个值,最后是2个值中采样3个值。这些组中可以有相同的值,例如,如果您从1:10采样并使用set.seed(1),则会得到c(3,4,5,10,3,9)。我同意代码有点神秘,希望能够解决这个问题。 – 2013-03-01 19:02:58

+0

这似乎有点牵强,试图在范围为1:99999的组中重复取值并选取几个值。但我明白你的观点。 – Arun 2013-03-01 19:07:07

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 
+0

这似乎与Hemmo给出的相反。他似乎是在组内没有重复和组间(可能)重复。 – Arun 2013-03-01 19:18:17