多次按组生成随机序号

Generate random sequential number by group with multiple times

我尝试多次按组生成随机数。

例如,

> 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中随机select个数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))

失败了。 warningIn 1:num

一起出现

这个我也试过了

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

错误再次出现,NA/NaN

如果你告诉我如何解决这个问题,我将不胜感激。

我不太清楚你的预期输出。

以下示例 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

我们可以创建一个列表列,然后 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