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