2014-02-09 62 views

回答

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 

ADDED更多的解決方案。

+0

好我的實際向量被定義爲y,所以我只是把:?長度(gregexpr(「()(= \\ 1) 「,y,perl = TRUE)[[1]])?當我嘗試它時,我只得到1:這是否意味着只有一對?考慮到我的列表中有5萬個字母,令人感到驚訝.. –

+1

y必須是一個字符串 – rawr

-1

找到一個字符的最長運行長度。減去一個以獲得這裏的對數。繼續添加這些。

1

@G。格羅騰迪克的回答是好,但我認爲一個非正則表達式的方法:

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