簡體   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