计算向量中连续对的数量

Count the number of consecutive pairs in a vector

假设我有以下向量:

    V<-c(-1,-1,-1,-1,-1,-1,-1,-1,1,1) 

我想计算以下类别中的连续对数:

    (1,1), (-1,1), (1,-1), and (-1,-1).

在我的示例中,有七对连续的 (-1,-1)、一对 (-1,1) 和一对 (1,1)

我正在尝试使用 split 函数解决这个问题,但我一直无法找出正确的因素。

想法是将第一个观察结果与第二个观察结果配对。第二个和第三个等等。最后一对应该是第 (n-1) 个观察值和第 n 个观察值。

也许是这样的

library(zoo)
table(rollapply(V, 2, toString))
# -1, -1  -1, 1   1, 1 
#      7      1      1 

或以 R 为基数

table(paste(head(V, -1), tail(V, -1)))
# -1 -1  -1 1   1 1 
#     7     1     1 

或者根据@akruns 的评论,没有 paste

table(head(V, -1), tail(V, -1))
#    -1 1
# -1  7 1
#  1  0 1

as.data.frame(table(head(V, -1), tail(V, -1)))
#   Var1 Var2 Freq
# 1   -1   -1    7
# 2    1   -1    0
# 3   -1    1    1
# 4    1    1    1

data.table:

library(data.table)
dt <- rev(data.table(embed(V,2)))
dt[,.N, by=names(dt)]
#    V2 V1 N
# 1: -1 -1 7
# 2: -1  1 1
# 3:  1  1 1

在 base R 中,将对的右半部分添加到差异中以创建分数:

V<-c(-1,-1,-1,-1,-1,-1,-1,-1,1,1)
table(diff(V) + V[-1])    
#-1  1  3 
# 7  1  1 

每对的得分是这样的:

(-1,-1) => (-1) - (-1) + (-1) = -1
(-1, 1) => ( 1) - (-1) +  (1) =  3
( 1,-1) => (-1) -  (1) + (-1) = -3
( 1, 1) => ( 1) -  (1) +  (1) =  1

所有连续的对都可以用两个平行向量表示,省略最后一个或第一个观察值

x <- V[-length(V)]
y <- V[-1]

然后交叉制表这些

> xtabs(~ x + y)
    y
x    -1 1
  -1  7 1
  1   0 1

或略有不同的形式

> as.data.frame(xtabs(~x+y))
   x  y Freq
1 -1 -1    7
2  1 -1    0
3 -1  1    1
4  1  1    1