计算向量中连续对的数量
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
假设我有以下向量:
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