从数据框中我得到一个新的数组,从数据帧切片。 我想得到一定重复出现的次数。
例如
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
,但它也计算了所有的重复,而且是不可取的。
我缺少快速解决方案吗?
答案 0 :(得分:4)
你可以使用R中的一个正则表达式工具,因为这实际上是一个模式匹配练习,特别是gregexpr
这个问题。 p
和q
向量代表搜索模式,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
注意 - 您还需要在向量main
,p
和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")
答案 1 :(得分:3)
我不确定这是不是最好的方法,但你可以通过以下方式完成这项工作:
f <- function(a,b)
if (length(a) > length(b)) 0
else all(head(b, length(a)) == a) + Recall(a, tail(b, -1))
有人可能会或可能找不到内置功能。</ p>
答案 2 :(得分: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
答案 3 :(得分:2)
以下是使用embed(v,n)
执行此操作的方法,该方法返回所有n
长度的矢量v
子序列的矩阵:
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