我要转换此数据集,以获取通过测试的特定数据点组中的“从”和“到”位置。

数据的外观如下:

pos <- seq(from = 10, to = 100, by = 10)
test <- c(1, 1, 1, 0, 0, 0, 1, 1, 1, 0)
df <- data.frame(pos, test)

因此,您可以看到位置10、20和30以及位置70、80和90通过了测试(b/c测试= 1),但是其余的点则没有通过。我正在寻找的答案将是一个数据框,看起来像下面代码中的“答案”数据框:
peaknum <- c(1, 2)
from <- c(10, 70)
to <- c(30, 90)
answer <- data.frame(peaknum, from, to)

关于如何转换数据集的任何建议?我很困惑

谢谢,
史蒂夫

最佳答案

我们可以使用data.table。使用rleid函数基于与“test”相同的相邻值创建行程组ID(“peaknum”)。使用“peaknum”作为分组变量,我们获得“pos”的“min”和“max”,同时将“i”指定为“test == 1”来对行进行子集化。如果需要,可以将“peaknum”值更改为序列(“seq_len(.N)”)。

library(data.table)
setDT(df)[, peaknum:= rleid(test)][test==1,
   list(from=min(pos), to=max(pos)) ,peaknum][, peaknum:= seq_len(.N)]
#   peaknum from to
#1:       1   10 30
#2:       2   70 90

09-11 03:29