gpt4 book ai didi

r - 如何有效地 reshape 我的 data.table

转载 作者:行者123 更新时间:2023-12-01 08:32:35 30 4
gpt4 key购买 nike

我有一个data.table DT

set.seed(1)
DT <- data.table(x=rep(c(1,2,3),each=4), y=c("A","B"), v=sample(1:100,12))
DT
x y v
1: 1 A 29
2: 1 B 92
3: 1 A 100
4: 1 B 82
5: 2 A 28
6: 2 B 26
7: 2 A 18
8: 2 B 22
9: 3 A 30
10: 3 B 96
11: 3 A 15
12: 3 B 4

我想像下面这样扩展它,为 x 的每个值创建一个新列并报告 v 值,数据中应该没有结构(不是像下面这样的 block )

    x y v.1  v.2 v.3
1: 1 A 29 NA NA
2: 1 B 92 NA NA
3: 1 A 100 NA NA
4: 1 B 82 NA NA
5: 2 A NA 28 NA
6: 2 B NA 26 NA
7: 2 A NA 18 NA
8: 2 B NA 22 NA
9: 3 A NA NA 30
10: 3 B NA NA 96
11: 3 A NA NA 15
12: 3 B NA NA 4

我问了一个非常相似的问题 here但无法改编 G Grothendieck 当时给我们的答案...

编辑:像往常一样,我在写完帖子后几乎得到它......我只需要用 NA 替换那些 0(我可能会在 v 中得到 0,我希望能够将 v==0 与丢失的项目分离)

DT2 <- DT[, {SUM.<-factor(x); data.table(model.matrix(~ SUM.:v + 0))}]
txtR) DT2
SUM.1:v SUM.2:v SUM.3:v
1: 29 0 0
2: 92 0 0
3: 100 0 0
4: 82 0 0
5: 0 28 0
6: 0 26 0
7: 0 18 0
8: 0 22 0
9: 0 0 30
10: 0 0 96
11: 0 0 15
12: 0 0 4

最佳答案

set.seed(1)
DT <- data.table(x=rep(c(1,2,3),each=4), y=c("A","B"), v=sample(1:100,12))

这给了

    x y  v
1: 1 A 27
2: 1 B 37
3: 1 A 57
4: 1 B 89
5: 2 A 20
6: 2 B 86
7: 2 A 97
8: 2 B 62
9: 3 A 58
10: 3 B 6
11: 3 A 19
12: 3 B 16

接下来,答案:

ux <- unique(DT$x)
DT[,c(v.=lapply(ux,function(i)v[x==i])),by="x,y"]

给了

    x y v.1 v.2 v.3
1: 1 A 27 NA NA
2: 1 A 57 NA NA
3: 1 B 37 NA NA
4: 1 B 89 NA NA
5: 2 A NA 20 NA
6: 2 A NA 97 NA
7: 2 B NA 86 NA
8: 2 B NA 62 NA
9: 3 A NA NA 58
10: 3 A NA NA 19
11: 3 B NA NA 6
12: 3 B NA NA 16

该答案可能会在 R 的更高版本中中断,但 OP 指出这也有效并且可能更快:

DT[,paste0("v.",ux):=lapply(ux,function(i)v[x==i]),by="x"]

关于r - 如何有效地 reshape 我的 data.table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16612254/

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