2013-03-01 2 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

ответ

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

+0

С предоставленными примерами уникальными (y [, 2]) являются c (3,1,2). Теперь, используя sapply, вы сначала пробуете 3 значения от 1: 99999, затем 1 значение и, наконец, 2 значения. В этих группах могут быть одинаковые значения, например, если вы отбираете 1:10 и используете set.seed (1), вы получаете c (3, 4, 5, 10, 3, 9). Я согласен с тем, что код является загадочным, надеюсь, это устранило проблему. –

+0

Кажется, что вы немного хотите получить повторяющиеся значения внутри групп с диапазоном 1: 99999 и выбрать несколько. Но я понимаю. – Arun

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

это похоже на противоположность тому, что дал Хеммо. Кажется, что он внутригрупп без повторения и межгруппового (возможно) повторения. – Arun

Смежные вопросы