提取数据集中的第一个和最后一个位置

Ste*_*ven 5 r dplyr

我有这个数据集,我正在尝试转换,以获得通过测试的特定数据点组中的"从"和"到"位置.

以下是数据的外观:

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)
Run Code Online (Sandbox Code Playgroud)

因此,您可以看到位置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)
Run Code Online (Sandbox Code Playgroud)

有关如何转换数据集的任何建议?我很难过.

谢谢,史蒂夫

akr*_*run 5

我们可以用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
Run Code Online (Sandbox Code Playgroud)

  • 这非常美妙.它让我觉得我应该在某些时候学习data.table :-) (2认同)