R 如何搜索特定模式的向量

R 如何搜索特定模式的向量,r,vector,seq,R,Vector,Seq,我希望有一个函数可以搜索特定模式的向量“4后1”(即“1”“4”)。它应该列出所有找到的序列和打印 每一个的定量,它们的长度,从哪里开始和结束 它应针对以下向量中的每个对数(1,4)搜索向量中小于N>=8的部分,并记住以下条件: 1) 如下所示的特定比率: BigRatio= Number of (1,4)*N/(Number of (1)*Number of (4)) has to be more or equal than 0.2 % 2) 和向量中(1,4)的比率(平均 S

我希望有一个函数可以搜索特定模式的
向量
“4后1”(即“1”“4”)。它应该列出所有找到的序列和打印
每一个的定量,它们的长度,从哪里开始和结束

它应针对以下向量中的每个对数(1,4)搜索向量中小于N>=8的部分,并记住以下条件:

1) 如下所示的特定比率:

BigRatio= Number of (1,4)*N/(Number of (1)*Number of (4)) 
    has to be more or equal than 0.2 % 
2) 和向量中
(1,4)
的比率(平均

 SmallRadtio= (Number of 1 + Number of 4)/(length of sequence) for 0.3%
如果满足条件,则应打印每次比赛的配给顺序

这是向量:

vector=c(1,1,1,1,1,1,1,4,4,4,4,2,3,1,1,1,1,1,1,1,4,4,4,4,2,3,1,4,1,4,1,4,1,4,1,4,
1,4,1,4,4,2,3,1,1,1,1,4,1,1,1,4,4,4,4,2,3,1,1,4,1,4,1,4,1,1,1,4,4,4,4,2,3,3,1,1,
4,1,4,1,4,1,1,1,4,4,4,4,4,4,4,4,2,3,1,1,1,1,1,1,1,4,4,1,1,4,2,1,1,1,1,1,1,4,3,
2,4,2,1,5,6,2,3,1,2,4,1,2,3,1,1,1,1,1,1,1,2,3,4,5,1,2,3,4,1,1,1,1,1,1,2,3,4,1,1,
1,2,3,1,2,3,1,2,3,4,3,1,2,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,
4,1,4,4,2,3,1,1,1,1,4,1,1,1,3,1,1,1,1,4,1,1,1,3,1,1,1,1,4,1,1,1,4,1,1,1,3,1,1,
1,1,4,2,3,1,1,4,1,4,1,4)

vector2=as.character(vector)
我把它改成了角色,因为我觉得这样会更容易。我可能是 错

到目前为止我的代码/进度

我有两个想法:

1) 该函数可以一次搜索8个或更多(我可以在函数中选择)数字,然后检查口粮。然后给出关于它的信息,如果它是一个很好的8个数字

2) 另一个想法是,将有一个评分系统,每对5分 每隔一个数为1,4和-1。然后它应该以某种方式给出一个估计 这些零件在哪里,应该找到这些分段。第一个想法的问题是 可能会有一个部分有40%,下一个部分有20%,加起来他们可能有更多。所以我试图找出如何摆脱消极积极因素的陷阱。也许搜索系统应该检查每个号码或配对 一个数字比一整段的数字大。这更复杂,但也更精确

有了这些代码,我就被困在如何生成函数的问题上了。我知道这些论点应该是正确的
vector
以及我要搜索的序列的所需长度(如果我要 第一个ide)。我想我必须使用
for循环
来计算每个数字(或两个数字),这样我就可以检查它们是否等于(1,4),然后“记住”它进行计算 那部分的长度。当然,搜索它的每个部分,从1到4 计算他们的口粮

我想过使用这种循环:

for (i in 1:length(vector)) {
    idx <- agrep(vector[i],x)
    matches[i] <- length(vector)
nchar(样本2)

这就是它应该做的:

1) 意念

  • 搜索字符串的每50个部分,即首先搜索该部分:

     "aaaaabababababababababababababababcabcbababcbcbabc"
    
  • 然后是这一部分(该字符串的50个元素的下一个序列)

    对于字符串中的每50个元素,这个值都是

    如您所见,第二个50个元素中有“ba”,与条件匹配。那就好了 不显示,因为它不符合条件

  • 下一件事是检查它是否满足了正确的条件(例如>0.5口粮) 上述公式适用于某一模式,在本例中为“ba”。如果其“ba”大于0.5 然后它应该打印出序列,比如开始时,返回口粮等等。 例如,它应该位于数据帧中
  • 下一个想法是计算该字符串中大于0.5的最佳分段。这意味着 如果在50个元素的第一部分中有0.4个“ba”,则会出现问题,并且 在该部分开头的“ba”的下一个50 0.1中: 想象中的前50名最后有很多ba,但还不够:

       "aaaaabababababdcdcdcdacacbababababababababababababab"
    
    接下来的50年有很多开始:

       "bababababababcbcdcbcbcbdcbbcbcbcbdbdbcbcbcbccbbcbbcd"
    
    那么,如何使其更为优化呢?我们是否应该按照上面解释的“ba”评分系统来查找
    满足条件的段的最佳长度?

    我很恼火,在生成有用的代码后,仍然没有向上投票,问题似乎仍然模棱两可。新示例中有换行符,但不清楚我们应该将这些换行符作为单独的换行符阅读,因为:

    > nchar(readLines(textConnection(sample2)))
    [1]  71  92 102  52
    
    将长字符值拆分为更小的部分并不难:

    samp3 <- paste(rep("a", 300), collapse="")
    mapply( substr, seq(1,nchar(samp3),by=50), seq(1,nchar(samp3),by=50)+49, MoreArgs=list(x=samp3))
    [1] "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    [2] "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    [3] "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    [4] "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    [5] "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    [6] "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    
    16是gregexpr值中的第二个位置,它引用了“向量”中的位置:


    您应该打印出所有中间值以查看发生了什么。

    您的向量以
    1 4 4开始。它被算作一个组还是第7和第8位的
    14
    被算作第1组?算作一个组
    14
    。向量中似乎有44个元素满足这个条件。它还不够具体。你给出了一个向量,但你没有说正确的答案是什么。目前,可接受运行长度>0.2%的标准似乎可以接受任何运行。这就是计划吗?目前还不清楚11111444和141414这两起不同的案件是如何处理的。不同的还是等效的?我将做一个编辑来解释我想用另一个例子做什么。
    > nchar(readLines(textConnection(sample2)))
    [1]  71  92 102  52
    
    samp3 <- paste(rep("a", 300), collapse="")
    mapply( substr, seq(1,nchar(samp3),by=50), seq(1,nchar(samp3),by=50)+49, MoreArgs=list(x=samp3))
    [1] "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    [2] "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    [3] "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    [4] "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    [5] "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    [6] "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    
    # convert to single character item
    collapsV <- paste0(vector,collapse="") 
    pos14 <- gregexpr("14", collapsV)  # regex pattern matching
    # look for runs of 2 differences , i.e. "14"'s next to each other
    diff14_2 <- rle( diff(gregexpr("14", collapsV)[[1]]) ) 
    #Run Length Encoding  ...# value is a two element list that looks like
    #  lengths: int [1:22] 1 1 6 1 1 1 2 1 1 2 ...
    #  values : int [1:22] 13 7 2 8 4 8 2 4 9 2 ...
    
    which( diff14_2$values==2 & diff14_2$lengths>4)
    [1]  3 16
    
    > pos14[[1]][3]
    [1] 27
    > vector[27:40]
     [1] 1 4 1 4 1 4 1 4 1 4 1 4 1 4
    > vector[25:40]
     [1] 2 3 1 4 1 4 1 4 1 4 1 4 1 4 1 4
    
    > pos14[[1]][16]
    [1] 76
    > vector[76:(76+8)]
    [1] 1 4 1 4 1 4 1 1 1