gpt4 book ai didi

r - do.call 构建和执行 data.table 命令

转载 作者:行者123 更新时间:2023-12-04 05:19:09 25 4
gpt4 key购买 nike

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

不知道去哪里用这个。

最佳答案

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

set() is able to add new columns by reference now. For example, set(DT, i=3:5, j="bla", 5L) is equivalent to DT[3:5, bla := 5L]. This was FR #2077. Tests added.



使用 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 .

关于r - do.call 构建和执行 data.table 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13869144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com