[英]Randomly separate one column into two groups based on ID in R
我有一个看起来像这样的数据框。 对于每个 ID,我想将主题随机分配到两个主题相对相等的组中,并且我还想添加一个新列来指示他们所在的组。例如,对于 ID 1,将 101 和 103 分配到组中A、102、104属于B组; 对于 ID 2、105 和 106 在 A 组中,107 在 B 组中。我有数千个 ID 和主题,我该如何做到这一点?
ID subject
1 1 101
2 1 102
3 1 103
4 1 104
4 2 105
5 2 106
6 2 107
对于每个ID
,您可以使用replace = TRUE
对要重复的值进行sample
,其中每个值的出现概率相同。
library(dplyr)
groups <- c('Group A', 'Group B')
df %>%
group_by(ID) %>%
mutate(group = sample(groups, n(), replace = TRUE)) -> result
请注意,以上内容是完全随机的,一个 4 行的ID
可能有 3 行的Group A
和 1 的Group B
。 如果您希望这两个组始终均匀分布,您可以使用rep
并对它们进行随机sample
。
df %>%
group_by(ID) %>%
mutate(group = sample(rep(groups, length.out = n()))) -> result
使用ave
来应用一个FUN
动作 ID-wise,我们可以重复一个向量1:2
length(ID)
次并对其sample
; 这可以通过rep_length
来完成。 为了避免向量总是从 1 开始(从而有利于一个组),我们还对向量进行了采样。
res <- transform(d, g=ave(ID, ID, FUN=function(x)
sample(rep_len(1:2, length(x)))))
res
# ID subject g
# 1 1 101 2
# 2 1 102 1
# 3 1 103 2
# 4 1 104 1
# 5 2 105 1
# 6 2 106 2
# 7 2 107 1
检查稍大的数据框:
d2 <- data.frame(ID=rep(1:10, each=7), subject=1:70)
res2 <- transform(d2, g=ave(ID, ID, FUN=function(x)
sample(rep_len(sample(1:2), length(x)))))
with(res2, table(g, ID))
# ID
# g 1 2 3 4 5 6 7 8 9 10
# 1 4 4 3 4 4 3 4 3 4 3
# 2 3 3 4 3 3 4 3 4 3 4
数据:
d <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L), subject = 101:107), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7"))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.