我想为id_group中的每个id_individual随机分配(在R中)值0或1。每个组由两个人组成,random_var应该遵守以下条件(在组内):sum(random_var)==1。更准确地说,我希望我的随机变量是这样的:| ID_组|ID_个体|随机变量|| - -----|- -----|- -----|| 一个|一个|一个|| 一个|2| 0|| 2|一个|0|| 2| 2|一个|你知道如何在R中编写这个请求吗?谢谢!克洛伊
mbyulnm01#
您可以在ave中尝试sample
ave
sample
> transform(df, Random_var = +(ave(ID_INDIVIDUAL, ID_GROUP, FUN = sample) == 1)) ID_GROUP ID_INDIVIDUAL Random_var 1 1 1 0 2 1 2 1 3 2 1 1 4 2 2 0
kqhtkvqz2#
dplyr选项使用group_by,如下所示:
dplyr
group_by
library(dplyr) df %>% group_by(ID_GROUP) %>% mutate(Random_var = sample(0:1)) #> # A tibble: 4 × 3 #> # Groups: ID_GROUP [2] #> ID_GROUP ID_INDIVIDUAL Random_var #> <int> <int> <int> #> 1 1 1 0 #> 2 1 2 1 #> 3 2 1 1 #> 4 2 2 0
创建于2023-05-26带有reprex v2.0.2
btqmn9zl3#
下面是一个自定义函数的解决方案:
my_binary <- function(n) { vec <- rep(0, n) if(n == 1) { vec <- sample(c(0, 1), 1) } else { vec[sample(n, 1)] <- 1 } return(vec) } library(dplyr) df %>% group_by(ID_GROUP) %>% mutate(Random_var = my_binary(n())) ID_GROUP ID_INDIVIDUAL Random_var <dbl> <dbl> <dbl> 1 1 1 0 2 1 2 1 3 2 1 0 4 2 2 1
数据:
df <- data.frame( ID_GROUP = c(1, 1, 2, 2), ID_INDIVIDUAL = c(1, 2, 1, 2) )
3条答案
按热度按时间mbyulnm01#
您可以在
ave
中尝试sample
kqhtkvqz2#
dplyr
选项使用group_by
,如下所示:创建于2023-05-26带有reprex v2.0.2
btqmn9zl3#
下面是一个自定义函数的解决方案:
数据: