gpt4 book ai didi

使用 data.table 功能将长结构化 data.table reshape 为宽结构?

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

> library(data.table)
> A <- data.table(x = c(1,1,2,2), y = c(1,2,1,2), v = c(0.1,0.2,0.3,0.4))
> A
x y v
1: 1 1 0.1
2: 1 2 0.2
3: 2 1 0.3
4: 2 2 0.4
> B <- dcast(A, x~y)
Using v as value column: use value.var to override.
> B
x 1 2
1 1 0.1 0.2
2 2 0.3 0.4

显然,我可以使用 f.x 将 data.table 从长到宽 reshape 。包 reshape2 的 dcast。但是 data.table 带有一个重载的括号运算符,提供像“by”和“group”这样的参数,这让我想知道是否可以使用它来实现它(到 data.table 特定功能)?

手册中的一个随机示例:
DT[,lapply(.SD,sum),by=x]

这看起来很棒——但我还不完全理解它的用法。

我既没有找到方法也没有找到一个例子,所以也许这是不可能的,也许它甚至不应该是 - 所以,一个明确的“不,不可能,因为......”当然也是一个有效的答案.

最佳答案

我将选择一个不相等组的示例,以便更容易说明一般情况:

A <- data.table(x=c(1,1,1,2,2), y=c(1,2,3,1,2), v=(1:5)/5)
> A
x y v
1: 1 1 0.2
2: 1 2 0.4
3: 1 3 0.6
4: 2 1 0.8
5: 2 2 1.0

第一步是使每组“x”的元素/条目数相同。这里,对于 x=1,y 有 3 个值,但对于 x=2,只有 2 个。所以,我们必须先用 NA 来解决这个问题,因为 x=2, y=3。
setkey(A, x, y)
A[CJ(unique(x), unique(y))]

现在,为了得到宽格式,我们应该按“x”分组并使用 as.listv如下:
out <- A[CJ(unique(x), unique(y))][, as.list(v), by=x]
x V1 V2 V3
1: 1 0.2 0.4 0.6
2: 2 0.8 1.0 NA

现在,您可以使用 setnames 的引用来设置重整列的名称。如下:
setnames(out, c("x", as.character(unique(A$y)))

x 1 2 3
1: 1 0.2 0.4 0.6
2: 2 0.8 1.0 NA

关于使用 data.table 功能将长结构化 data.table reshape 为宽结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18047754/

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