gpt4 book ai didi

r - 根据列在 data.table 中创建序列

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

假设我有以下 data.table:

library(data.table)

DT <- data.table(R=sample(0:1, 10000, rep=TRUE), Seq=0)

返回如下内容:
       R Seq
1: 1 0
2: 1 0
3: 0 0
4: 0 0
5: 1 0
---
9996: 1 0
9997: 0 0
9998: 0 0
9999: 0 0
10000: 1 0

我想生成一个序列 (1, 2, 3,..., n),每当 R 从上一行更改时,该序列就会重置。把它想象成我在计算一连串的随机数。

所以上面的内容看起来像:
       R Seq
1: 1 1
2: 1 2
3: 0 1
4: 0 2
5: 1 1
---
9996: 1 5
9997: 0 1
9998: 0 2
9999: 0 3
10000: 1 2

想法?

最佳答案

这是一个选项:

set.seed(1)
DT <- data.table(R=sample(0:1, 10000, rep=TRUE), Seq=0L)
DT[, Seq:=seq(.N), by=list(cumsum(c(0, abs(diff(R)))))]
DT

我们使用 cumsum(abs(diff(R))) 创建了一个计数器,每当您的 0-1 变量发生变化时,该计数器就会递增。 . c(0,部分是确保我们得到正确的长度向量。然后我们用 by 分割它.这产生:
       R Seq
1: 0 1
2: 0 2
3: 1 1
4: 1 2
5: 0 1
---
9996: 1 1
9997: 0 1
9998: 1 1
9999: 1 2
10000: 1 3

编辑 : 处理澄清请求:

让我们看看我在 by 中使用的计算,分为两个新列:
DT[, diff:=c(0, diff(R))]
DT[, cumsum:=cumsum(abs(diff))]
print(DT, topn=10)

产生:
       R Seq diff cumsum
1: 0 1 0 0
2: 0 2 0 0
3: 1 1 1 1
4: 1 2 0 1
5: 0 1 -1 2
6: 1 1 1 3
7: 1 2 0 3
8: 1 3 0 3
9: 1 4 0 3
10: 0 1 -1 4
---
9991: 1 2 0 5021
9992: 1 3 0 5021
9993: 1 4 0 5021
9994: 1 5 0 5021
9995: 0 1 -1 5022
9996: 1 1 1 5023
9997: 0 1 -1 5024
9998: 1 1 1 5025
9999: 1 2 0 5025
10000: 1 3 0 5025

您可以看到每次 R 更改时,差异绝对值的累积总和如何增加 1。然后我们可以使用 cumsum列拆解 data.table成块,对于每个块,使用 seq(.N) 生成一个序列这计入块中的项目数( .N 正好表示,每个 by 组中有多少项目)。

关于r - 根据列在 data.table 中创建序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25415749/

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