我按照以下方式对数据集进行了排序:
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
。
答案 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