Генерация случайного последовательного числа по группе с многократным - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь сгенерировать случайное число по группе несколько раз.

Например,

> set.seed(1002)
> df<-data.frame(ID=LETTERS[seq(1:5)],num=sample(c(2,3,4), size=5, replace=TRUE))
> df
  ID num
1  A   3
2  B   4
3  C   3
4  D   2
5  E   3

В ID я хочу сгенерировать последовательное случайное число без замены на (например) 4 раза.

Если ID равен A, он будет случайным образом выбирать числа из 1:3 4 раза. Итак, это будет

sample(c(1,2,3,1,2,3,1,2,3),replace=FALSE)

или

ep(sample(c(1:4), replace=FALSE),times=4)

Если результат будет 3 2 1 2 1 3 2 3 3 1 1 2, то данные будут

  ID num
1  A   3
2  A   2
3  A   2
4  A   1
5  A   1
6  A   3
7  A   2
8  A   1
9  A   3

Я попробовал несколько вещей , как

df%>%group_by(ID)%>%mutate(random=sample(rep(1:num,times=4),replace=FALSE))

Не удалось. warning появился с In 1:num

Я тоже попробовал это.

ddply(df,.(ID),function(x) sample(rep(1:num,times=4),replace=FALSE))

Ошибка появилась снова, с NA/NaN.

Я был бы очень признателен, если Вы дайте мне знать, как решить эту проблему.

Ответы [ 2 ]

1 голос
/ 23 января 2020

Мы можем создать список-столбец, а затем unnest, чтобы он имел отдельные строки.

n <- 4
library(dplyr)

df %>%
  group_by(ID) %>%
  mutate(num = list(sample(rep(seq_len(num), n)))) %>%
  tidyr::unnest(num)

#  ID      num
#   <fct> <int>
# 1 A         2
# 2 A         2
# 3 A         2
# 4 A         3
# 5 A         3
# 6 A         1
# 7 A         3
# 8 A         1
# 9 A         1
#10 A         3
# … with 50 more rows
1 голос
/ 23 января 2020

Я не совсем уверен относительно ожидаемого результата.

Следующие образцы num элементов из 1:num с заменой, и сохранение образцов в столбце list sample.

library(tidyverse)
set.seed(2018)
df %>% mutate(sample = map(num, ~sample(1:.x, replace = T)))
#  ID num     sample
#1  A   2       1, 1
#2  B   4 3, 4, 1, 2
#3  C   2       1, 1
#4  D   4 3, 3, 4, 4
#5  E   2       2, 2

Или, если вы хотите повторить выборку num элементов (с заменой) 4 раза, вы можете сделать

set.seed(2018)
df %>%
    mutate(sample = map(num, ~as.numeric(replicate(4, sample(1:.x, replace = T)))))
#ID num                                         sample
#1  A   2                         1, 1, 1, 2, 1, 2, 1, 1
#2  B   4 3, 3, 4, 4, 4, 4, 4, 2, 3, 4, 3, 3, 2, 1, 1, 2
#3  C   2                         1, 1, 1, 1, 1, 1, 1, 2
#4  D   4 2, 3, 2, 1, 3, 4, 1, 2, 1, 2, 2, 1, 1, 1, 2, 1
#5  E   2                         2, 1, 2, 2, 1, 1, 1, 2
...