我想随机化一个因子,另一个因子应该在第一个因子内随机化。我该怎么做?
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
通过unique
id 进行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