2013-06-28 2 views
4

R에서 시퀀스의 반복 부분을 계산할 수 있습니까? 예를 들어 :R에서 시퀀스의 반복되는 반복 부분을 계산하는 방법은 무엇입니까?

x<- c(1,3.0,3.1,3.2,1,1,2,3.0,3.1,3.2,4,4,5,6,5,3.0,3.1,3.2, 
     3.1,2,1,4,6,4.0,4,3.0,3.1,3.2,5,3.2,3.0,4) 

IT는 서브 3.0,3.1,3.2이 발생하는 시간을 계산 할 수 있습니까? 따라서이 예제에서는 다음과 같아야합니다. 4

+0

방금 ​​특정 서브를 계산 하시겠습니까? 또는 데이터에있을 수있는 다른 하위 시퀀스를 식별 하시겠습니까? – A5C1D2H2I1M1N2O1R2T1

+4

부동 소수점 값 일치에 대한 표준 경고를 삽입하십시오. 모든 것을 숫자로 유지해야하는 경우를 제외하고'sprintf ("% 2f", mydata)'또는 이와 동등한 방식으로 데이터를 실행하여 문자열에서 정확하게 일치시킬 수 있습니다. –

답변

5

나는 같은 것을 할 것 :

pattern <- c(3, 3.1, 3.2) 
len1 <- seq_len(length(x) - length(pattern) + 1) 
len2 <- seq_len(length(pattern))-1 
sum(colSums(matrix(x[outer(len1, len2, '+')], 
    ncol=length(len1), byrow=TRUE) == pattern) == length(len2)) 

PS를 : 당신이 각 인스턴스의 시작을 얻을 것이다 sumwhich에 변경.

2

gregexpr을 문자열로 바꿀 수 있습니다.

sum(gregexpr("3 3.1 3.2", paste(x, collapse=" "), fixed=TRUE)[[1]] != -1) 
[1] 4 
+1

'gregexpr'은 매치가없는 경우 -1을 반환하기 때문에 일치가 없을 때 1의 답을 줄 것입니다. – Arun

+2

이것은 겹치는 순서에 대해 잘못된 결과를줍니다 :'x = c (1,2,2,2,3,2,2); s = c (2,2)' – eddi

+0

@eddi OP가 겹치는 순서로 무엇을 원하는지 실제로 알지 못한다면 '바르게'말하는 것이 약간 어리석은 일입니다. 사실 중복 시퀀스를 고려해야 할 경우 모든. –

2

Carl Witthoft의 seqle function이 여기 유용 할 수 있습니다.

기능은 다음과 같습니다

seqle <- function(x,incr=1) { 
    if(!is.numeric(x)) x <- as.numeric(x) 
    n <- length(x) 
    y <- x[-1L] != x[-n] + incr 
    i <- c(which(y|is.na(y)),n) 
    list(lengths = diff(c(0L,i)), 
     values = x[head(c(0L,i)+1L,-1L)]) 
} 

이 데이터에 적용, 그것은 다음과 같아야합니다

temp <- seqle(x, incr=.1) 
temp 
# $lengths 
# [1] 1 3 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 1 1 3 1 1 1 1 
# 
# $values 
# [1] 1.0 3.0 1.0 1.0 2.0 3.0 4.0 4.0 5.0 6.0 5.0 3.0 3.1 2.0 1.0 4.0 
# [17] 6.0 4.0 4.0 3.0 5.0 3.2 3.0 4.0 

을 이제 우리가 어떻게 그것을 읽습니까? lengths은 우리 벡터가 1, 3, 1, 1, 1, 3 ... values의 순서로 길이 3의 시퀀스의 첫 번째 값이 " 3.0 "이면, 길이 3의 다음 순서의 첫 x 째 값은"3.0 "이됩니다.

data.frame으로보기가 더 쉽습니다. 이 예에서

data.frame(temp)[temp$lengths > 1, ] 
# lengths values 
# 2  3  3 
# 6  3  3 
# 12  3  3 
# 20  3  3 

는 모든 시퀀스의 길이는 동일, 그들은 같은 값에서 시작, 그래서 우리는 바로 위의 data.frame을 결과의 행 수를 보면 답을 얻을 수 있습니다.

+0

+1, 이것이 OP가 원하는 것인지 확실하지는 않지만. 예 : 패턴은 'c (10, 8, 15)'일 수도 있습니다. – Arun

+0

@Arun, true 그냥 거기 던져! – A5C1D2H2I1M1N2O1R2T1

+1

명백한 이유 때문에 +1을 쓰지 않아도됩니다 .-). 그러나 당신이 나의 파생적인 일을 언급 할 것을 기쁘게 생각합니다. –

3

하나 더 (일반적인 이동 창) 방법 :

x <- c(1,3.0,3.1,3.2,1,1,2,3.0,3.1,3.2,4,4,5,6,5,3.0,3.1,3.2, 3.1,2,1,4,6,4.0,4,3.0,3.1,3.2,5,3.2,3.0,4) 
s <- c(3, 3.1, 3.2) 

sum(apply(embed(x, length(s)), 1, function(y) {all(y == rev(s))})) 
# [1] 4 

embed의 출력은 무슨 일이 일어나고 있는지 이해를 참조하십시오. 아룬으로

는 여기 apply 지적 꽤 느리다, 하나는이 훨씬 빨리으로 얻을 수 아룬의 matrix 트릭과 함께 embed를 사용할 수 있습니다

sum(colSums(matrix(embed(x, length(s)), 
        byrow = TRUE, nrow = length(s)) == rev(s)) == length(s)) 
+0

처음에는'embed '을 가로 질렀습니다. 그러나 벡터 스캔은 조 변경을 필요로했습니다. 또는 하나는'apply'를 사용해야합니다. 따라서 행렬을 구성하는 데 되돌아 왔습니다. – Arun

+1

은 의미가 있습니다. 방금 테스트했는데, 이것은'apply'를 없애고'matrix' 것을 할 때'outer' 접근법보다 약간 빠릅니다. 나는 그 접근 방식을 편집 할 것이다. – eddi