如何以dcast的方式自我加入data.table

Cor*_*one 9 r data.table

假设我有一个data.table"融化"的形式,我有一个键,标识符和值

library(data.table)
library(reshape2)
DT = data.table(X = c(1:5, 1:4), Y = c(rep("A", 5), rep("B", 4)), Z = rnorm(9))
DT2 = data.table(dcast(DT, X~Y))
Run Code Online (Sandbox Code Playgroud)

我怎样才能在里面进行那种自我加入data.table

> DT
   X Y           Z
1: 1 A -0.19790449
2: 2 A  0.17906116
3: 3 A  0.01821837
4: 4 A  0.17309716
5: 5 A  0.05962474
6: 1 B -0.24629468
7: 2 B  0.92285734
8: 3 B  0.66002573
9: 4 B -1.01403880
> DT2
   X           A          B
1: 1 -0.19790449 -0.2462947
2: 2  0.17906116  0.9228573
3: 3  0.01821837  0.6600257
4: 4  0.17309716 -1.0140388
5: 5  0.05962474         NA
Run Code Online (Sandbox Code Playgroud)

除此之外(主要针对Arun): 这是我已经用于融化的解决方案(在Matthew D的帮助下编写,所以他应该有这个代码),我认为复制完全融化,并且非常有效.另一方面Dcast(或者应该是dtcast?)要困难得多!

melt.data.table = function(data, id.vars, measure.vars,
                           variable.name = "variable",
                           ..., na.rm = FALSE, value.name = "value") {
  if(missing(id.vars)){
    id.vars = setdiff(names(data), measure.vars)
  }
  if(missing(measure.vars)){
    measure.vars = setdiff(names(data), id.vars)
  }

  dtlist = lapply(measure.vars, function(..colname) {
    data[, c(id.vars, ..colname), with = FALSE][, (variable.name) := ..colname]
  })

  dt = rbindlist(dtlist)
  setnames(dt, measure.vars[1], value.name)
  if(na.rm){
    return(na.omit(dt))
  } else {
    return(dt)
  }
}
Run Code Online (Sandbox Code Playgroud)

Aru*_*run 8

更新:更快的版本meltdcast现在中实现(C语言)data.table版本>= 1.9.0.查看此帖子了解更多信息.

现在你可以这样做:

dcast.data.table(DT, X~Y)
Run Code Online (Sandbox Code Playgroud)

dcast单独的情况下,目前,它必须完全写出(因为它不是S3通用的reshape2).我们会尽快解决这个问题.因为melt,你可以melt(.)正常使用.


一般的想法是这样的:

setkey(DT, X, Y)
DT[CJ(1:5, c("A", "B"))][, as.list(Z), by=X]
Run Code Online (Sandbox Code Playgroud)

您可以命名列V1,并V2AB使用setnames.

但这可能对大数据或演员公式很复杂时效率不高.或者我应该说,它可能更有效率.我们正在寻找这样一种实现方法,将融合和强制转换为data.table.在那之前,你可以像上面那样解决这个问题.

一旦我们在熔化/铸造方面取得了重大进展,我将更新这篇文章.

  • 哇+1我不知道'SJ`和`CJ`.不能等待`dcast.data.table`选项了! (2认同)
  • 或者`DT [CJ(唯一(X),唯一(Y))] [...]`(以避免`DT $`重复)和`DT [CJ(唯一(X),唯一(Y)),. ..]`尽可能多地使用`[...]`进行查询优化,以便更多地进行咀嚼(因为`[...]`内的所有内容都是延迟评估).顺便说一下@Carone,Arun在C中的融化应该比我们的融化要好得多.他真的进入了`data.table`的C端并修复了一些段错误.当你阅读[新闻](https://r-forge.r-project.org/scm/viewvc.php/pkg/NEWS?view=markup&root=datatable)时,现在并不总是支持它. (2认同)