在data.table中强制groupby值

时间:2016-05-30 10:43:27

标签: r data.table

我按照以下方式对数据集进行了排序:

dt2<-dt[,list(Lconf=length(blockid)),by=list(subject,conf,state,memtype)]

   subject conf state memtype Lconf   conf_tx
1:   LT003    0    FA      FM    13 0.2031250
2:   LT003    0    FA      WM    21 0.3333333
3:   LT003    0    OM      FM    15 0.2343750
4:   LT003    0    OM      WM    16 0.2500000
5:   LT003    1    FA      FM    27 0.4218750
6:   LT003    1    FA      WM    27 0.4285714

conf_tx后面计算的比率。我想要所有科目的均值,所以:

dtconf<-dt2[,list(conf_tx=mean(conf_tx,na.rm=T)),by=list(conf,state,memtype)]

   conf state memtype   conf_tx
1:    0    FA      FM 0.1715586
2:    0    FA      WM 0.3694943
3:    0    OM      FM 0.3218533
4:    0    OM      WM 0.4531198
5:    1    FA      FM 0.4855792
6:    1    FA      WM 0.4961775

从{0}到{3},conf可能有4个值。

我的问题是:某些科目在某些条件下没有conf=3的任何值,导致错误的均值。

是否可以强制data.table创建行

subject conf state memtype Lconf   conf_tx
  LT005    3    OM      WM     0 0.0000000

即使没有价值?类似于,by=list(conf=c(0,1,2,3),state,memtype)

精确度:我计算每个受试者的每个置信度响应的比率(0,1,2,3),因此我的比率是每个响应的数量,而不是所有响应的总和。当主题从未回答“3”时,我想要一行data.table仍然计算length(conf==3)=0

1 个答案:

答案 0 :(得分:4)

计算您的平均值,然后使用交叉连接添加缺少的组合:

#example data
library(data.table)
DT <- data.table(a = rep(1:3, each = 3), b = rep(1:3, 3), x = rnorm(9))
DT <- DT[c(1:4, 6:9)]

#cross join
DT[CJ(a = 1:3, b = 1:3), on = c("a", "b")]
#   a b          x
#1: 1 1 -2.5665330
#2: 1 2  0.6298771
#3: 1 3  0.6448454
#4: 2 1  0.9303104
#5: 2 2         NA
#6: 2 3 -1.9168810
#7: 3 1 -0.7579373
#8: 3 2 -0.6833026
#9: 3 3  2.6123457