2011-06-02 85 views
1

數組從數據幀的重複,我得到一個新的數組,從數據幀切片。 我想要得到的時間有一定的重複出現在它的量。的R - 在其他陣列

例如

main <- c(A,B,C,A,B,V,A,B,C,D,E) 
p <- c(A,B,C) 
q <- c(A,B) 

someFunction(main,p) 
2 

someFunction(main,q) 
3 

我一直在rle瞎搞,但它計算每subrepetion也undersirable。

是否有一個快速的解決方案我失蹤?

回答

4

您可以使用正則表達式的工具之一R中,因爲這是一個真正的模式匹配的運動,特別是gregexpr這個問題。該pq向量代表的搜索模式和main是我們要搜索的模式。從幫助頁面gregexpr

gregexpr returns a list of the same length as text each element of which is of 
the same form as the return value for regexpr, except that the starting positions 
of every (disjoint) match are given. 

因此,我們可以採取由gregexpr這給比賽的開始位置返回的第一個列表的長度。我們首先崩潰的載體,然後執行搜索:

someFunction <- function(haystack, needle) { 
    haystack <- paste(haystack, collapse = "") 
    needle <- paste(needle, collapse = "") 
    out <- gregexpr(needle, haystack) 
    out.length <- length(out[[1]]) 
    return(out.length) 
} 

> someFunction(main, p) 
[1] 2 
> someFunction(main, q) 
[1] 3 

注 - 您還需要拋出「」在你的向量mainp,並且q載體,除非你有變量A,B,C,等已定義。

main <- c("A","B","C","A","B","V","A","B","C","D","E") 
p <- c("A","B","C") 
q <- c("A","B") 
+0

非常棒!它工作得很好,謝謝一堆。 – 2011-06-02 14:49:04

+0

不錯,它可以與示例數據一起使用。但它可能不適用於所有的輸入,因爲你的崩潰。當你想在'c(1,2,3,123)'中搜索'c(1,2,3)'時會發生什麼? – Andrie 2011-06-02 14:52:48

+0

好的電話。幸運的是我不能有這樣的輸入,但確實是一個問題。 – 2011-06-02 14:59:54

3

我不知道這是否是最好的方式,但你完全可以做到這一點的工作方式:

f <- function(a,b) 
    if (length(a) > length(b)) 0 
    else all(head(b, length(a)) == a) + Recall(a, tail(b, -1)) 

有人可能會或可能不會找到一個內置功能。

+0

+1這很整潔,並且很好學習'Recall()!' – 2011-06-02 15:25:58

2

使用sapply

find_x_in_y <- function(x, y){ 
    sum(sapply(
     seq_len(length(y)-length(x)), 
     function(i)as.numeric(all(y[i:(i+length(x)-1)]==x)) 
)) 
} 


find_x_in_y(c("A", "B", "C"), main) 
[1] 2 

find_x_in_y(c("A", "B"), main) 
[1] 3 
2

這裏是一種使用embed(v,n)做到這一點,它返回矢量v的所有n - 長度的子序列的矩陣:

find_x_in_y <- function(x, y) 
        sum(apply(embed(y, length(x)), 1, 
            identical, rev(x))) 

> find_x_in_y(p, main) 
[1] 2 
> find_x_in_y(q, main) 
[1] 3