如何在R中为数据的一个子集获得1和0的随机赋值,为其余数据获得0的随机赋值

如何在R中为数据的一个子集获得1和0的随机赋值,为其余数据获得0的随机赋值,r,random,grouping,R,Random,Grouping,我有一个按组划分的数据框架,每组的观察数相同。我随机给每组分配了一个1或0的值。对于给定值为1的组中的所有观察值,我希望变量ysp填充一组随机的1和0。对于分配0的组,我希望用所有0填充同一变量ysp 这是我目前掌握的代码: rm(list=ls(all=TRUE)) set.seed(1984) ngroup <- 50 # Number of groups obs <- 50 # Number of observations per group pgroup <

我有一个按组划分的数据框架,每组的观察数相同。我随机给每组分配了一个1或0的值。对于给定值为1的组中的所有观察值,我希望变量ysp填充一组随机的1和0。对于分配0的组,我希望用所有0填充同一变量ysp

这是我目前掌握的代码:

rm(list=ls(all=TRUE))

set.seed(1984)
ngroup <- 50 # Number of groups
obs <- 50      # Number of observations per group
pgroup <- 0.5 # (1 - p) probability of groups with at least 1 non zero obs (only works if the answer is a round number)
p <- 0.5 # Once chosen the number of groups I want to have with at least one non zero obs, I want p% of 1s in those groups.

constantdata <- data.frame(id=1:ngroup)

dummies <- c(0,1)
dummies[sample(1:nrow(constantdata), nrow(constantdata), FALSE)] <- rep(dummies, c(pgroup*ngroup,(1-pgroup)*ngroup))
constantdata["probgr"] <- dummies

fulldata <- constantdata[rep(1:ngroup, each=obs),] 

fulldata$ys <- rnorm(ngroup*obs) 

#This is how I try to do it

if(fulldata$probgr=1){
fulldata$ysp[fulldata$ys > quantile(fulldata$ys, 1 - p)] <- 1 
fulldata$ysp[fulldata$ys <= quantile(fulldata$ys, 1 - p)] <- 0
}else{
fulldata$ysp=0}
rm(list=ls(all=TRUE))
种子集(1984年)
n组您编写的
if(fulldata$probgr=1)
您的意思可能是
if(fulldata$probgr==1)
(平等测试,而不是赋值)。此外,if不是向量运算。获取所需内容的一种方法是将ysp中的所有内容设置为0,然后随机更改probgr==1的内容,如下所示:

fulldata$ysp = 0
fulldata$ysp[fulldata$probgr == 1] = sample(0:1, sum(fulldata$probgr == 1), replace=TRUE)
你写的
if(fulldata$probgr=1)
可能是指
if(fulldata$probgr==1)
(平等性测试,而不是赋值)。此外,if不是向量运算。获取所需内容的一种方法是将ysp中的所有内容设置为0,然后随机更改probgr==1的内容,如下所示:

fulldata$ysp = 0
fulldata$ysp[fulldata$probgr == 1] = sample(0:1, sum(fulldata$probgr == 1), replace=TRUE)

这是一个非常优雅的解决方案。只有一个问题。我在sample()函数的末尾添加了概率(否则它默认为.5):fulldata$ysp=0 fulldata$ysp[fulldata$probgr==1]=sample(0:1,sum(fulldata$probgr==1),replace=TRUE,prob=c(1-p,p)),但它并没有精确地给出1和0的50%,而是给出一个每次都会变化的接近值(我认为是概率函数的一部分)。这是一个非常优雅的解决方案。只有一个问题。我在sample()函数的末尾添加了概率(否则它默认为.5):fulldata$ysp=0 fulldata$ysp[fulldata$probgr==1]=sample(0:1,sum(fulldata$probgr==1),replace=TRUE,prob=c(1-p,p))但它并没有给出1和0的50%,而是每次都会改变的接近值(我认为是概率函数的一部分)。