如何编码约束随机化(2个因素)



我想随机化一个因子,另一个因子应该在第一个因子内随机化。我该怎么做?

id <- rep(c(10,20,30), each=3)
visit <- rep(1:3,3)
df <- data.frame(id, visit)
df
id visit
1 10     1
2 10     2
3 10     3
4 20     1
5 20     2
6 20     3
7 30     1
8 30     2
9 30     3

例如,它可能看起来像这样: 身份证访问

1 20     1
2 20     3
3 20     2
4 30     3
5 30     2
6 30     1
7 10     1
8 10     2
9 10     3

这是随机化每个 id 的代码,但我不知道如何将其放入函数中,然后随机化第二列。

uniq <- unique(df[,1]) %>% sample()

您可以使用sapply通过uniqueid 进行sample

set.seed(42)
dat$visit <- unlist(lapply(unique(dat$id), function(i) sample(dat$visit[dat$id == i])))
dat
#   id visit
# 1 10     2
# 2 10     1
# 3 10     3
# 4 20     3
# 5 20     1
# 6 20     2
# 7 30     3
# 8 30     1
# 9 30     2

编辑:要对 ID 的顺序进行采样,您可以在之后对行进行采样,dat[sample(nrow(dat)), ].或者全部组合成transform()

set.seed(42)
transform(dat,
visit=unlist(lapply(unique(dat$id), function(i) 
sample(dat$visit[dat$id == i]))))[sample(nrow(dat)), ]
#   id visit
# 8 30     3
# 7 30     2
# 4 20     1
# 1 10     1
# 5 20     2
# 2 10     3
# 9 30     1
# 3 10     2
# 6 20     3

要使用抽样访问对 id 范围进行抽样,您可以使用by方法。

set.seed(42)
do.call(rbind, by(dat, dat$id, function(x) {
transform(x, visit=sample(visit))
})[sample(seq(unique(dat$id)))])
#      id visit
# 30.7 30     2
# 30.8 30     3
# 30.9 30     1
# 20.4 20     1
# 20.5 20     2
# 20.6 20     3
# 10.1 10     1
# 10.2 10     3
# 10.3 10     2

说明:by"id"秒处的数据拆分为数据框列表,可以按上述方式transform,并在sample顺序后rbind到生成的数据框中。


数据:

(dat <- expand.grid(visit=1:3, id=(1:3)*10)[2:1])
#   id visit
# 1 10     1
# 2 10     2
# 3 10     3
# 4 20     1
# 5 20     2
# 6 20     3
# 7 30     1
# 8 30     2
# 9 30     3

最新更新