我希望有一个功能可以在4"之后为特定模式搜索vector
" 1 (即#34; 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
以及我想要搜索的序列所需的长度(如果我选择的话)
第一个想法。我想我必须使用for loop
计算每个数字(或两个数字),我可以检查它是否等于(1,4)然后"记住"它计算
那个部分的长度。当然,搜索其中的每个部分1 ili 4 to
计算他们的口粮。
我想过使用这种循环:
for (i in 1:length(vector)) {
idx <- agrep(vector[i],x)
matches[i] <- length(vector)
但我认为这是错误的,而且不是很正确。
我还是编程和R的新手。
其他问题:
如果函数用于数据框,该函数将如何显示?它会将搜索更改为指定行吗?是否可以将矢量转换为数据框?
编辑:
另一个例子和澄清:
sample2=c("aaaaabababababababababababababababcabcbababc bcbabcbcdddcbcbcdcbcbcbdcb
bcbcbcbdbdbcbcbcbccbbcbbcbcbcbcbcbcbabababababababccbbcbbcbcbcbcbcbcbdbdbcbcbcbccb
bcbcbcbdbdbcbcbcbccbbcbbcbcbcbcbcbbababababababababababababacbcbacbcbcdcbcbcbdcbbcdaddabcbac
cabcbabcbabcbcbbabbabababababababababababa")
的nchar(SAMPLE2)
这就是它应该做的事情:
1)想法
搜索字符串的每50个部分,这意味着第一部分:
"aaaaabababababababababababababababcabcbababcbcbabc"
然后这部分(该字符串的50个元素的下一个序列)
"bcbabcbcdddcbcbcdcbcbcbdcbbcbcbcbdbdbcbcbcbccbbcbb"
对于字符串的每个其他50个元素来说就是这样。
正如你所看到的,第二个50个元素有&#34; ba&#34;在它符合条件。那就是 不显示,因为它不符合条件。
下一个想法是计算此字符串中> 0.5的最佳段。这意味着 如果在50个元素的第一部分中有0.4个&#34; ba&#34;那么就会出现问题。在它,和 在接下来的50 0.1&#34; ba&#34;在该部分的开头就在其中: 虚构的前50个最后有很多ba,但还不够:
"aaaaabababababdcdcdcdacacbababababababababababababab"
接下来的50人有很多开始:
"bababababababcbcdcbcbcbdcbbcbcbcbdbdbcbcbcbccbbcbbcd"
那么如何让这更优化呢?我们应该为&#34; ba&#34;如上所述,找到 满足条件的段的最佳长度?
答案 0 :(得分:1)
我很生气,在制作有用的代码之后仍然没有upvote,问题似乎仍然模糊不清。新的例子提供了它,但是不清楚我们应该把它们作为单独的行读出来,因为:
> 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"
如果你想在学术上取得进步,你需要以其他方式表达一个具体的例子。
------------第一次尝试:
这是一些矢量化代码,应该生成执行此操作所需的工具。找到正确的矢量化函数可以让您超越SAS和BASIC所培养的for-loop心态。循环在需要时很有用,但通常R程序员试图避免它们,除非真的需要。我不确定所期望的确切结果是什么,但至少这应该推动对话:
# 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
所以第三个gregexpr&#34;击中&#34;将成为&#34; vector&#34;第一次14141414运行,至少4对长。检查一下:
> 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
16是gregexpr值中的第二个位置,它返回&#34; vector&#34;中的位置:
> pos14[[1]][16]
[1] 76
> vector[76:(76+8)]
[1] 1 4 1 4 1 4 1 1 1
您应该打印出所有中间值以查看正在发生的事情。