2

我有一个小的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 的结果(由于偶然性而导致的差异)。没有什么用,因为我需要将每个测试相互比较。

不知道该去哪里。

4

1 回答 1

3

更新:在v1.8.11中,现在实现了FR #2077set() -现在可以通过引用添加列,. 来自新闻

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

于 2012-12-13T22:38:37.527 回答