2

テスト セル (AB テスト結果) ごとに 1 つのレコードを表す小さなレコードがdata.tableあり、各テスト セルを他のテスト セルと比較する列をさらにいくつか追加したいと考えています。つまり、追加する列の数は、問題の 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))

1つのテストセルの結果をそれ自体と比較するだけです.0.50の結果(偶然による違い)。それぞれのテストを互いに比較する必要があるため、これまで何の役にも立ちません。

これでどこに行くべきかわからない。

4

1 に答える 1

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

于 2012-12-13T22:38:37.527 に答える