2015-06-01 4 views
4

Предположим, что у меня есть следующий вектор:Подсчитайте количество последовательных пар в векторе

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,1).

Я пытаюсь решить эту проблему, используя функцию split, но я не смог выяснить правильные факторы.

Идея состоит в том, чтобы соединить первое наблюдение со вторым. Второй с 3-м и так далее. Последняя пара должна быть (n-1) -й наблюдением с n-м наблюдением.

+0

Не совсем такой же, как [этот вопрос] (HTTP: // StackOverflow .com/q/30489952/980833) –

+0

Может быть дубликат https://stackoverflow.com/questions/10643798/counting-consecutive-numbers-in-a-vector-or-array-in-r? –

+0

Можем ли мы считать, что у вас никогда не было более двух возможных значений в вашем векторе? –

ответ

11

Все последовательные пары могут быть представлены двумя параллельными векторами, опуская последний o г первое наблюдение

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 
9

Может быть что-то вроде этого

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 
+0

Не могу сказать: похоже, что первый способ работает для N разных значений на входе, но второй может не быть. Вы можете проверить? –

+0

@CarlWitthoft не совсем следующее. Можете ли вы привести пример?Я тестировал на 'V <-sample (1: 3, 15, replace = TRUE)', например, и все кажется прекрасным. –

+0

возможно 'V <- sample (1: 5, 100, replace = TRUE)', так что существует 25 возможных пар Vj, Vj + 1. –

7

С 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 
2

В базовой 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 
+0

Это приятно, но выход не очень читаем, я думаю –

Смежные вопросы