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