我有一个小的data.table
代表每个测试单元一个记录(AB测试结果),我想添加几个比较每个测试单元的列,相对于每个其他测试单元。换句话说,我想要添加的列数取决于所讨论的AB测试中有多少个测试单元。
我的data.table
看起来像是:
Group Delta SD.diff
Control 0 0
Cell1 0.00200 0.001096139
Cell2 0.00196 0.001095797
Cell3 0.00210 0.001096992
Cell4 0.00160 0.001092716
我想添加以下列(数字在这里是垃圾):
Group v.Cell1 v.Cell2 v.Cell3 v.Cell4
Control 0.45 0.41 0.45 0.41
Cell1 0.50 0.58 0.48 0.66
Cell2 0.58 0.50 0.58 0.48
Cell3 0.48 0.58 0.50 0.70
Cell4 0.66 0.48 0.70 0.50
我确信do.call
是要走的路,但我无法弄清楚如何将一个do.call嵌入到另一个内部以生成脚本......我无法弄清楚如何执行脚本(总共20行)。我目前最接近的是:
a <- do.call("paste",c("test.1.results <- mutate(test.1.results, P.Better.",list(unlist(test.1.results[,Group]))," = pnorm(Delta, test.1.results['",list(unlist(test.1.results[,Group])),"'][,Delta], SD.diff,lower.tail=TRUE))", sep=""))
产生5个脚本行,如:
test.1.results <- mutate(test.1.results, P.Better.Cell2 = pnorm(Delta, test.1.results['Cell2'][,Delta], SD.diff,lower.tail=TRUE))
仅将一个测试单元结果与自身进行比较.. 0.50结果(由于偶然的差异)。没有用,因为我需要每个测试相互比较。
不知道该去哪儿。
答案 0 :(得分:3)
更新:在v1.8.11中,FR #2077现已实施 - set()
现在可以按引用添加列,。来自NEWS:
set()
现在可以通过引用添加新列。例如,set(DT, i=3:5, j="bla", 5L)
相当于DT[3:5, bla := 5L]
。这是FR #2077
。测试补充说。
使用set()
这样的任务通常会更容易。为了演示,这里是你在问题中所拥有的翻译(未经测试)。但我意识到你想要的东西与你发布的东西不同(我不太明白,很快就会这样)。
for (i in paste0("Cell",1:4))
set(DT, # the data.table to update/add column by reference
i=NULL, # no row subset, NULL is default anyway
j=paste("P.Better.",i), # column name or position. must be name when adding
value = pnorm(DT$Delta, DT[i][,Delta], DT$SD.diff, lower.tail=TRUE)
请注意,您只能添加新列的子集,其余的将使用NA填充。 :=
和set
。