gpt4 book ai didi

R: 从长格式表到 "diagonal"格式

转载 作者:行者123 更新时间:2023-12-02 08:20:34 25 4
gpt4 key购买 nike

假设我有这样的长格式数据:

ID   T     X      Y     Z
1 1 x1 y1 z1
1 2 x2 y2 z2
1 3 x3 y3 z3
2 1 ....

有几个输入变量(这里只有 X 和 Y)和输出变量(这里是 Z)。
我只显示了第一行,属于个人 1,但我们会在这下面有更多数据。

如何将其转换为这种格式:

1    1     x1                y1                   z1
1 2 x1 x2 y1 y2 z2
1 3 x1 x2 x3 y1 y2 y3 z3
2 1 ... ....

缺少的空间将是 NAs o 0。
欢迎使用 data.table、dplyr 或 base R 的任何解决方案。

我这样做的原因是因为我想要这样的回归:

y1 = a10 + a11·X1
y2 = a20 + a21·X1 + a22·X2
y3 = a30 + a31·X1 + a32·X2 + a33·X3

如果你想要一个可重现的例子:

set.seed(1)
ID <- rep(1:4,each=4)
XX <- round(runif(16),3)
YY <- round(runif(16),3)
TT <- rep(1:4, 4)
ZZ <- ave(XX*TT,ID, FUN = cumsum)
data.frame(ID,TT,XX, YY, ZZ)

ID TT XX YY ZZ
1 1 1 0.266 0.718 0.266
2 1 2 0.372 0.992 1.010
3 1 3 0.573 0.380 2.729
4 1 4 0.908 0.777 6.361
5 2 1 0.202 0.935 0.202
6 2 2 0.898 0.212 1.998
7 2 3 0.945 0.652 4.833
8 2 4 0.661 0.126 7.477
9 3 1 0.629 0.267 0.629
10 3 2 0.062 0.386 0.753
11 3 3 0.206 0.013 1.371
12 3 4 0.177 0.382 2.079
13 4 1 0.687 0.870 0.687
14 4 2 0.384 0.340 1.455
15 4 3 0.770 0.482 3.765
16 4 4 0.498 0.600 5.757

如果我想要这样的结果怎么办?

1    1     x1                y1                   z1
1 2 x2 x1 y2 y1 z2
1 3 x3 x2 x1 y3 y2 y1 z3
2 1 ... ....

最佳答案

创建一个函数,创建一个按行填充值的矩阵,并将上三角设置为零:

fun <- function(x) {
m <- matrix(x, length(x), length(x), byrow = TRUE)
m[upper.tri(m)] <- 0
as.data.frame(m)
}

#test it
fun(1:4)
# V1 V2 V3 V4
#1 1 0 0 0
#2 1 2 0 0
#3 1 2 3 0
#4 1 2 3 4

library(data.table) #for its by
setDT(DF)
DF[, paste0("x", 1:4) := fun(XX), by = ID]
DF[, paste0("y", 1:4) := fun(YY), by = ID]
# ID TT XX YY ZZ x1 x2 x3 x4 y1 y2 y3 y4
# 1: 1 1 0.266 0.718 0.266 0.266 0.000 0.000 0.000 0.718 0.000 0.000 0.000
# 2: 1 2 0.372 0.992 1.010 0.266 0.372 0.000 0.000 0.718 0.992 0.000 0.000
# 3: 1 3 0.573 0.380 2.729 0.266 0.372 0.573 0.000 0.718 0.992 0.380 0.000
# 4: 1 4 0.908 0.777 6.361 0.266 0.372 0.573 0.908 0.718 0.992 0.380 0.777
# 5: 2 1 0.202 0.935 0.202 0.202 0.000 0.000 0.000 0.935 0.000 0.000 0.000
# 6: 2 2 0.898 0.212 1.998 0.202 0.898 0.000 0.000 0.935 0.212 0.000 0.000
# 7: 2 3 0.945 0.652 4.833 0.202 0.898 0.945 0.000 0.935 0.212 0.652 0.000
# 8: 2 4 0.661 0.126 7.477 0.202 0.898 0.945 0.661 0.935 0.212 0.652 0.126
# 9: 3 1 0.629 0.267 0.629 0.629 0.000 0.000 0.000 0.267 0.000 0.000 0.000
#10: 3 2 0.062 0.386 0.753 0.629 0.062 0.000 0.000 0.267 0.386 0.000 0.000
#11: 3 3 0.206 0.013 1.371 0.629 0.062 0.206 0.000 0.267 0.386 0.013 0.000
#12: 3 4 0.177 0.382 2.079 0.629 0.062 0.206 0.177 0.267 0.386 0.013 0.382
#13: 4 1 0.687 0.870 0.687 0.687 0.000 0.000 0.000 0.870 0.000 0.000 0.000
#14: 4 2 0.384 0.340 1.455 0.687 0.384 0.000 0.000 0.870 0.340 0.000 0.000
#15: 4 3 0.770 0.482 3.765 0.687 0.384 0.770 0.000 0.870 0.340 0.482 0.000
#16: 4 4 0.498 0.600 5.757 0.687 0.384 0.770 0.498 0.870 0.340 0.482 0.600

对于其他结果,您可以使用 shift:

DF[, paste0("x", 1:4) := shift(XX, 0:3, fill = 0), by = ID]
# ID TT XX YY ZZ x1 x2 x3 x4
# 1: 1 1 0.266 0.718 0.266 0.266 0.000 0.000 0.000
# 2: 1 2 0.372 0.992 1.010 0.372 0.266 0.000 0.000
# 3: 1 3 0.573 0.380 2.729 0.573 0.372 0.266 0.000
# 4: 1 4 0.908 0.777 6.361 0.908 0.573 0.372 0.266
# 5: 2 1 0.202 0.935 0.202 0.202 0.000 0.000 0.000
# 6: 2 2 0.898 0.212 1.998 0.898 0.202 0.000 0.000
# 7: 2 3 0.945 0.652 4.833 0.945 0.898 0.202 0.000
# 8: 2 4 0.661 0.126 7.477 0.661 0.945 0.898 0.202
# 9: 3 1 0.629 0.267 0.629 0.629 0.000 0.000 0.000
#10: 3 2 0.062 0.386 0.753 0.062 0.629 0.000 0.000
#11: 3 3 0.206 0.013 1.371 0.206 0.062 0.629 0.000
#12: 3 4 0.177 0.382 2.079 0.177 0.206 0.062 0.629
#13: 4 1 0.687 0.870 0.687 0.687 0.000 0.000 0.000
#14: 4 2 0.384 0.340 1.455 0.384 0.687 0.000 0.000
#15: 4 3 0.770 0.482 3.765 0.770 0.384 0.687 0.000
#16: 4 4 0.498 0.600 5.757 0.498 0.770 0.384 0.687

但是,我的印象是我们有一个 XY problem这里。如果您解释了您的实际目标(在一个新问题中,使用可重现的示例),可能会建议更好的方法。

关于R: 从长格式表到 "diagonal"格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37657368/

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