gpt4 book ai didi

r - 我如何以 dcast 之类的方式自行加入 data.table

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

假设我有一个 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))

我怎样才能在 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

旁白(主要是给 Arun):
这是我已经用于melt的解决方案(在Matthew D的帮助下编写,所以他应该有这个代码),我认为它完全复制了melt,并且非常有效。另一方面,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)
}
}

最佳答案

更新: melt 的更快版本和 dcast现在在 data.table 中实现(在 C 中)版本 >= 1.9.0 .查询 this post了解更多信息。

现在你可以这样做:

dcast.data.table(DT, X~Y)

如果是 dcast目前,它必须单独写出(因为它在 reshape2 中还不是 S3 泛型)。我们会尽快解决这个问题。对于 melt,您可以使用 melt(.)就像你平时做的那样。

大体思路是这样的:
setkey(DT, X, Y)
DT[CJ(1:5, c("A", "B"))][, as.list(Z), by=X]

您可以为列命名 V1V2AB使用 setnames .

但这在大数据上或当转换公式很复杂时可能效率不高。或者更确切地说,我应该说,它可以更有效率。我们正在寻找这样的实现来将melt 和cast 集成到data.table。在那之前,你可以像上面那样解决这个问题。

一旦我们在熔化/类型转换方面取得重大进展,我将更新这篇文章。

关于r - 我如何以 dcast 之类的方式自行加入 data.table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18729705/

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