gpt4 book ai didi

r - 将 data.frame 扩展为长格式并增加值

转载 作者:行者123 更新时间:2023-12-01 08:57:28 26 4
gpt4 key购买 nike

我想将我的数据从短格式转换为长格式,我想有一种简单的方法可以做到这一点(可能使用 reshape2、plyr、dplyr 等?)。

例如,我有:

foo <- data.frame(id = 1:5, 
y = c(0, 1, 0, 1, 0),
time = c(2, 3, 4, 2, 3))

id y time
1 0 2
2 1 3
3 0 4
4 1 2
5 0 3

我想将每一行展开/复制 n 次,其中 n 是“时间”列中该行的值。但是,我还希望变量“时间”从 1 增加到 n。也就是说,我想制作:

id  y time
1 0 1
1 0 2
2 1 1
2 1 2
2 1 3
3 0 1
3 0 2
3 0 3
3 0 4
4 1 1
4 1 2
5 0 1
5 0 2
5 0 3

作为奖励,我还想对变量“y”进行某种递增,对于那些 y = 1 的 id,y 设置为 0,直到“时间”的最大值。也就是说,我想制作:

id  y time
1 0 1
1 0 2
2 0 1
2 0 2
2 1 3
3 0 1
3 0 2
3 0 3
3 0 4
4 0 1
4 1 2
5 0 1
5 0 2
5 0 3

这似乎是 dplyr 可能已经做的事情,但我只是不知道去哪里找。无论如何,任何避免循环的解决方案都是有帮助的。

最佳答案

您可以使用正确的 id 创建新数据框和 time长格式的列,然后将其与原始格式合并。这留下 NA对于不匹配的值,然后可以将其替换为 0 :

merge(foo, 
with(foo,
data.frame(id=rep(id,time), time=sequence(time))
),
all.y=TRUE
)
## id time y
## 1 1 1 NA
## 2 1 2 0
## 3 2 1 NA
## 4 2 2 NA
## 5 2 3 1
## 6 3 1 NA
## 7 3 2 NA
## 8 3 3 NA
## 9 3 4 0
## 10 4 1 NA
## 11 4 2 1
## 12 5 1 NA
## 13 5 2 NA
## 14 5 3 0

类似的合并适用于第一次扩展。合并 foo没有 time与上面创建的数据框相同的列:

merge(foo[c('id','y')], 
with(foo,
data.frame(id=rep(id,time), time=sequence(time))
)
)
## id y time
## 1 1 0 1
## 2 1 0 2
## 3 2 1 1
## 4 2 1 2
## 5 2 1 3
## 6 3 0 1
## 7 3 0 2
## 8 3 0 3
## 9 3 0 4
## 10 4 1 1
## 11 4 1 2
## 12 5 0 1
## 13 5 0 2
## 14 5 0 3

没有必要指定 all (或 all.y )在后一个表达式中,因为有多个 time每个匹配的值 id值,并且这些被扩展。在前面的例子中,time两个数据帧中的值都匹配,并且没有指定 all (或 all.y )你会得到你的原始数据。

关于r - 将 data.frame 扩展为长格式并增加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26152999/

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