繁体   English   中英

根据 R 中的 ID 将一列随机分成两组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM