将整数向量分组为连续运行

jia*_*mao 7 aggregate r

我有两个整数向量.我想确定在由第一个载体调节的第二个载体中呈现的连续整数序列的间隔(该载体可以看作是一个因子,通过该因子,第二个载体可以分成几个组).

在这里,我为我的问题提出了一个假人.

在第二个向量的一组(由第一向量定义)中的数据,整数单调增加.

my.data <- data.frame(
    V1=c(rep(1, 10), rep(2, 9), rep(3,11)), 
    V2=c(seq(2,5), seq(7,11), 13, seq(4, 9), seq(11,13), seq(1, 6), seq(101, 105))
)
Run Code Online (Sandbox Code Playgroud)

我想要的是:

  • 输出间隔的开始和结束
  • 这里,第一列中的组,第二列中的起始整数,第三列中的结束整数.

预期成绩:

1, 2, 5 \n
1, 7, 11 \n
1, 13, 13 \n
2, 4, 9 \n
2, 11, 13 \n
3, 1, 6 \n
3, 101, 105 \n
Run Code Online (Sandbox Code Playgroud)

Joh*_*ohn 10

这是使用聚合的简短回答....

runs <- cumsum( c(0, diff(my.data$V2) > 1) )
aggregate(V2 ~ runs + V1, my.data, range)[,-1]


  V1 V2.1 V2.2
1  1    2    5
2  1    7   11
3  1   13   13
4  2    4    9
5  2   11   13
6  3    1    6
7  3  101  105
Run Code Online (Sandbox Code Playgroud)


Car*_*oft 9

不久前,我写了一个rle()我命名的变体,seqle()因为它允许人们寻找整数序列而不是重复.然后,你可以这样做:

Rgames: seqle(my.data[my.data$V1==1,2]) #repeat for my.data$V1 equal to 2 and 3
$lengths 
[1] 4 5 1 

$values 
[1]  2  7 13 
Run Code Online (Sandbox Code Playgroud)

(例如).将这些结果变成你想要的表格形式需要一些小小的尝试,但我想我会提到它.顺便说一句,这是代码seqle.如果你设置了incr=0你得到基础结果.

function(x,incr=1){ 

    if(!is.numeric(x)) x <- as.numeric(x) 
    n <- length(x)  
    y <- x[-1L] != x[-n] + incr 
    i <- c(which(y|is.na(y)),n) 
    list( lengths = diff(c(0L,i)),  values = x[head(c(0L,i)+1L,-1L)]) 
} 
Run Code Online (Sandbox Code Playgroud)

编辑:有一个很好的升级,由flodel提供,如何检查向量是否包含n个连续数字.他指出,在使用双精度版时,此版本存在通常的浮点错误问题,并提供了修复程序.


koh*_*ske 6

这是一个例子:

library(plyr)

ddply(my.data, .(V1), 
 function(x) data.frame(do.call("rbind", tapply(x$V2, cumsum(c(T, diff(x$V2)!=1)), 
   function(y) c(min(y), max(y))))))
Run Code Online (Sandbox Code Playgroud)

也许,太复杂了,但重要的是cumsum(c(T, diff(x$V2)!=1)).

> ddply(my.data, .(V1), 
+  function(x) data.frame(do.call("rbind", tapply(x$V2, cumsum(c(T, diff(x$V2)!=1)), 
+    function(y) c(min(y), max(y))))))
  V1  X1  X2
1  1   2   5
2  1   7  11
3  1  13  13
4  2   4   9
5  2  11  13
6  3   1   6
7  3 101 105
Run Code Online (Sandbox Code Playgroud)