R 整数向量的区间长度之和

R 整数向量的区间长度之和,r,intervals,R,Intervals,假设我有一个整数向量: > int.vec [1] 1 2 3 5 6 7 10 11 12 13 (从int.vec创建)我们可以通过取相邻元素的差值来创建分组变量,检查其是否不等于1,获取cumsum,使用tapply获取长度,并求和输出 sum(tapply(int.vec,cumsum(c(TRUE,diff(int.vec) !=1)), FUN=length)) #[1] 10 或者使用表格和总和 sum(table(int.vec,cumsum(c(TRU

假设我有一个整数
向量

> int.vec
 [1]  1  2  3  5  6  7 10 11 12 13

(从
int.vec创建)我们可以通过取相邻元素的差值来创建分组变量,检查其是否不等于1,获取
cumsum
,使用
tapply
获取
长度
,并
求和
输出

sum(tapply(int.vec,cumsum(c(TRUE,diff(int.vec) !=1)), FUN=length))
#[1] 10

或者使用
表格
总和

sum(table(int.vec,cumsum(c(TRUE,diff(int.vec) !=1))))
#[1] 10

或者我们使用从
cumsum
派生的分组变量
split
拆分
int.vec
split
非常快速),并获得每个
列表
元素的
length
(另一个快速选项)-由@Frank提供

sum(lengths(split(int.vec, cumsum(c(0,diff(int.vec)>1)))))
注意:没有使用包。这将有助于通过移除
sum
包装来识别每个组件的单个
长度(如果我们需要)


根据@SymbolX解决方案的进一步见解,OP的预期输出只是
向量的
长度

NROW(int.vec)
#[1] 10
也可以使用。如果我们使用的是
数据.frame
,这也会起作用。但是,正如我上面提到的,OP似乎需要识别每个间隔的
长度以及
长度。这个解决方案提供了这两个方面。

cgwtools包中有一个名为
seqle
的函数,在这里可能会有所帮助

library(cgwtools)
int.vec <- c(1:3,5:7,10:13)
seqle(int.vec)
# Run Length Encoding
#   lengths: int [1:3] 3 3 4
#   values : int [1:3] 1 5 10
您的间隔是数字序列,
x1:xn
x1:xm
x1:xp
,其中每个向量(或本例中的间隔)的长度分别为
n
m
,和
p

整个向量的长度是
length(x1:xn)
+
length(x1:xm)
+
length(x1:xp)
, 这与
长度(n+m+p)
相同


现在,如果我们真的对序列中每个向量的长度感兴趣,我们可以

int.vec <- c(1:3,5:7,10:13)

## use run-length-encoding (rle) to find sequences where the difference == 1
v <- rle(diff(int.vec) == 1)[[1]]
v[v!=1] + 1
# [1] 3 3 4

你可以使用
diff
函数这将不会是
length(int.vec)
?@Symbolix,这是最好的答案:-)与此相结合,如果他们使用
list
而不是
c
,他们将能够使用
length
函数来获得3,3,4向量(显然,
sum(length)(int.vec))
获取总长度。@AHandcartAndMohair谢谢-我在回答中添加了这个:)还可以利用新的
length
函数
sum(length(split(int.vec,cumsum)(c(0,diff(int.vec)>1щ)
。我猜否决票是因为您没有确定OP所需的输出与
length(int.vec)
@Frank谢谢。但是,我想知道
长度
是否适用于跨平台。上周,我正在使用Alteryx测试一个预测应用程序(由我自己开发)。不过,我使用了R的当前版本,
length
不起作用。
sum(seqle(int.vec)$lengths)
# [1] 10
length(int.vec)
# 10
int.vec <- c(1:3,5:7,10:13)

## use run-length-encoding (rle) to find sequences where the difference == 1
v <- rle(diff(int.vec) == 1)[[1]]
v[v!=1] + 1
# [1] 3 3 4
int.list <- list(c(1:3), c(5:7), c(10:13))
lengths(int.list)
# [1] 3 3 4