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