data.table J参数:具有两个组的2个参数的函数,其中一个具有一个固定子集

时间:2017-05-26 12:36:15

标签: r data.table

我正在使用data.table的J参数来获取变量的置信区间,如下所示:

mt=data.table(mtcars)
mt_m=mt[,.(qsec=mean(qsec),CI1=t.test(qsec)$conf.int[1],CI2=t.test(qsec)$conf.int[2]),.(cyl)]
mt_m
   cyl     qsec      CI1      CI2
1:   6 17.97714 16.39856 19.55573
2:   4 19.13727 18.00699 20.26755
3:   8 16.77214 16.08159 17.46270

绘制平均值和错误栏非常有用。但现在我想针对我的控制测试每个条件并获得p值,例如mt[,.(p=t.test(qsec,qsec[cyl%in%4])$p.value),.(cyl)](显然不起作用)。

  

t.test.default中的错误(qsec,qsec [%4中的cyl%]):     没有足够的'y'观察

     

complete.cases(x,y)出错:     并非所有参数都具有相同的长度(paired test)

有没有办法使用data.table来实现这个目标?

修改

Mike的答案适用于第一个MWE,只有一个组。但是,我的数据表有两个:

dt=data.table(var1=c(rep(1,18),rep(2,18),rep(3,18)),
              var2=rep(c("A","B","C"),54),score=runif(162))
dt_m=dt[,list(score=mean(score),CI1=TCI1(score),CI2=TCI2(score),
              p=t.test(score,dt[var2%in%"A",score])$p.value),
        .(var1,var2)]
dt_m
   var1 var2     score       CI1       CI2         p
1:    1    A 0.5291396 0.3737159 0.6845634 0.6062132
2:    1    B 0.4784482 0.3426129 0.6142835 0.9326820
3:    1    C 0.5445497 0.4079861 0.6811133 0.4452131
4:    2    A 0.5047712 0.3519982 0.6575442 0.8146140
5:    2    B 0.4717234 0.3406157 0.6028311 0.8605529
6:    2    C 0.4670736 0.3273769 0.6067704 0.8205882
7:    3    A 0.4210423 0.2671292 0.5749555 0.4531821
8:    3    B 0.4392489 0.2828231 0.5956746 0.5952569
9:    3    C 0.4308970 0.3267391 0.5350549 0.4078637

t检验不是由var2&计算的。 var1pvar2A为{1}},使用配对测试时会出现同样的错误。

如何通过两组来实现这一目标?

1 个答案:

答案 0 :(得分:2)

我认为这应该适合你:

mt[,.(p=t.test(qsec,mt[cyl%in%4, qsec])$p.value),.(cyl)]

#   cyl           p
#1:   6 0.181367998
#2:   4 1.000000000
#3:   8 0.001004706

由于您希望cyl进行测试以访问参考向量(其中cyl == 4),您需要调用mt

修改 对于编辑过的数据,这是你想要的吗?

dt_m=dt[,list(score = mean(score),
              p     = t.test( score, dt[ var2 %in% "A" & var1 == .SD[,var1], score], paired = T)$p.value),
        .(var1,var2), .SDcols = c("var1","score")]
dt_m

#   var1 var2     score          p
#1:    1    A 0.5315900        NaN
#2:    1    B 0.4632127 0.43045276
#3:    1    C 0.5630583 0.77617068
#4:    2    A 0.4084932        NaN
#5:    2    B 0.4977118 0.34873263
#6:    2    C 0.5238550 0.29289210
#7:    3    A 0.3653734        NaN
#8:    3    B 0.6186752 0.03029701
#9:    3    C 0.4629279 0.23013739

将来,从一开始就发布实际用例会很有帮助,这样可以更容易地找到有效的解决方案,而不必继续来回。