【问题标题】:do.call to build and execute data.table commandsdo.call 构建和执行 data.table 命令
【发布时间】:2012-12-13 21:54:15
【问题描述】:

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

不知道该去哪里。

【问题讨论】:

  • 鉴于您使用包 data.table 为什么使用mutate?这没有使用 data.table 的任何功能。
  • 我在强迫自己学习data.table,在这种情况下它并不理想,但它在大多数时候表现得像一个数据框。如果我需要回到可信赖的数据框,我会
  • @AndrewDempsey 在这种情况下包含形容词可信赖不太可能让我站在一边并有动力提供帮助,顺便说一句。
  • "trustworthy" 在我更熟悉 data.frames 的上下文中。我对 data.table 的总暴露是我现在正在编写的代码,因为我弄清楚了 data.table 的过滤、选择和分组的语法,所以需要更长的时间。项目截止日期意味着我可能选择了错误的时间来玩 data.table,因为速度并不是真正的问题
  • 那是错误的词。好像你的意思很熟悉。是的,听起来现在是学习 data.table 的错误时机,尤其是在您并不真正需要它的情况下。

标签: r data.table plyr


【解决方案1】:

更新:在 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

【讨论】:

  • 错误,但对我来说很容易解决这个问题:无法使用 set() 添加列,请使用 := 改为通过引用添加列
  • 实际上,我正在切换到 data.frames,因为我只完成了我需要做的一半。应该尽快返工这一半,然后更快地完成下半场
  • 这看起来很有希望。我无法在没有错误的情况下运行: dput(DT) structure(list(Group = structure(c(5L, 1L, 2L, 3L, 4L), .Label = c("Cell1", "Cell2", "Cell3) ", "Cell4", "控制"), class= "因子"), Delta = c(0, 0.002, 0.00196, 0.0021, 0.0016), SD.diff = c(0, 0.001096139, 0.001095797, 0.001096992, 0.001092716) , .Names = c("Group", "Delta", "SD.diff"), row.names = c(NA, -5L), class= c("data.table", "data.frame"), .internal.selfref = )
  • @Dwin 和 Andrew,哎呀,确实如此。好的,我已经更新了FR2077 set() needs to be able to add new columns
猜你喜欢
  • 2017-05-16
  • 2013-07-31
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多