在data.table中按行和组rbinom(或else)
我想为data.table中g组中的每一行绘制Y。要进行说明,请进行以下简单模拟:在data.table中按行和组rbinom(或else),r,data.table,R,Data.table,我想为data.table中g组中的每一行绘制Y。要进行说明,请进行以下简单模拟: set.seed(123) N = 50 g = 3 DT = data.table(id = rep(1:N,g), group_id = sort(rep(1:g, N)), p = runif(150, min = 0, max = 1) ) DT[, Y := rbinom(n = .N, size =
set.seed(123)
N = 50
g = 3
DT = data.table(id = rep(1:N,g),
group_id = sort(rep(1:g, N)),
p = runif(150, min = 0, max = 1)
)
DT[, Y := rbinom(n = .N, size = 1, prob = p), by = group_id]
DTs = split(DT, by = "group_id")
DTs = rbindlist(DTs[1], idcol=T)
DTs[, Y := rbinom(n = .N, size = 1, prob = p)]
head(DT)
head(DTs)
为什么DT和DTs的Y不同?我认为这是等效的
> head(DT)
id group_id p Y
1: 1 1 0.2875775 1
2: 2 1 0.7883051 1
3: 3 1 0.4089769 0
4: 4 1 0.8830174 1
5: 5 1 0.9404673 1
6: 6 1 0.0455565 0
> head(DTs)
.id id group_id p Y
1: 1 1 1 0.2875775 1
2: 1 2 1 0.7883051 1
3: 1 3 1 0.4089769 1
4: 1 4 1 0.8830174 1
5: 1 5 1 0.9404673 1
6: 1 6 1 0.0455565 0
每次执行随机抽取时,随机数生成器都会被洗牌,因此在第二次二项抽取时处于不同的状态。如果要进行相同的绘制,则需要确保在绘制之前设置种子:
set.seed(123)
N=50
g=3
DT=数据表(id=代表(1:N,g),
组id=排序(rep(1:g,N)),
p=runif(150,最小值=0,最大值=1)#RNG改变状态
)
#为二项式绘制指定种子
种子集(456)
DT[,Y:=rbinom(n=0.n,size=1,prob=p),by=group#u id]#RNG改变状态
DTs=拆分(DT,by=“group_id”)
DTs=rbindlist(DTs[1],idcol=T)
#如果我们想要相同的绘图,我们需要将种子设置为相同的状态
种子集(456)
DTs[,Y:=rbinom(n=0.n,size=1,prob=p)]
给你
head(DT)
#>id组\u id p Y
#> 1: 1 1 0.2875775 0
#> 2: 2 1 0.7883051 1
#> 3: 3 1 0.4089769 1
#> 4: 4 1 0.8830174 1
#> 5: 5 1 0.9404673 1
#> 6: 6 1 0.0455565 0
总目(DTs)
#>.id组\u id p Y
#> 1: 1 1 1 0.2875775 0
#> 2: 1 2 1 0.7883051 1
#> 3: 1 3 1 0.4089769 1
#> 4: 1 4 1 0.8830174 1
#> 5: 1 5 1 0.9404673 1
#> 6: 1 6 1 0.0455565 0
使用DTs[,Y:=rbinom(n=.n,size=1,prob=p)]
您再次重新计算Y
!嗯,等一下,我会修好的。输入代码太快了。问题依然存在