2014-02-09 2 views
1

나는 긴 문자 목록 인 벡터를 가지고 있으며, 몇 쌍의 문자가 있는지 알고 싶습니다. 예를 들어 AABBAAACC이 있으면 5 쌍이됩니다.R 문자 벡터에서 고유 한 쌍 찾기 R

어떻게해야할지 모르겠다.

x <- "AABBAAACC" 

저는 초보자입니다. 친절하게 대해주세요!

답변

3

1) gregexpr이 시도 :

> length(gregexpr("(.)(?=\\1)", "AABBAAACC", perl = TRUE)[[1]]) 
[1] 5 

2) rollapply

> library(zoo) 
> > sum(rollapply(strsplit("AABBAAACC", "")[[1]], 2, function(x) x[1] == x[2])) 
[1] 5 

2A) 또는 약간 더 컴팩트 :

> library(zoo) 
> library(gsubfn) 
> sum(fn$rollapply(strsplit("AABBAAACC", "")[[1]], 2, ~ x[1] == x[2])) 
[1] 5 

3) 머리/꼬리

> s <- strsplit("AABBAAACC", "")[[1]] 
> sum(tail(s, -1) == head(s, -1)) 
[1] 5 

이상의 솔루션을 추가했다.

+0

그럼 내 실제 벡터를 Y로 정의된다, 그래서 그냥 둘 것 :.? 길이 (gregexpr ("() (= \\ 1) ", y, perl = TRUE) [[1]])? 내가 그것을 시도하면, 나는 단지 1을 얻는다 : 이것은 단지 한 쌍이 있다는 것을 의미합니까? 꽤 놀라운 건 내 목록에 50k 글자가 있다고 생각하면 .. –

+1

y는 문자열이어야합니다. – rawr

-1

한 문자의 최장 실행 길이를 찾습니다. 여기에서 쌍의 수를 구하려면 1을 빼십시오. 계속 추가하십시오.

1

@G. 그로 텐 디크의 대답은 잘하지만 난이 아닌 정규식 접근 방식의 생각 :

runs <- rle(unlist(strsplit("AABBAAACC", NULL))) 
sum(runs[[1]][runs[[1]] > 1] - 1)