【发布时间】:2014-11-08 16:29:08
【问题描述】:
我想要一个函数来搜索vector 的特定模式“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 到
计算他们的口粮。
我想过使用这种循环:
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 个元素中包含符合条件的“ba”。所以这将 不满足条件,不显示。
- 接下来是通过以下方式检查它是否满足正确的条件(例如 >0.5 口粮) 上面提到的公式针对某种模式,在这种情况下是“ba”。如果它的“ba”大于 >0.5 然后它应该打印出那个序列,比如它什么时候开始,返回口粮等等。 例如,这应该在数据框中。
下一个想法是计算该字符串中>0.5 的最佳分段是什么。这意味着 如果在 50 个元素的第一部分中有 0.4 个“ba”,就会出现问题,并且 在“ba”的下一个 50 0.1 中,就在该部分的开头: 想象中的前 50 个最后有很多 ba,但还不够:
"aaaaabababababdcdcdcdacacbababababababababababababab"
接下来的50个有很多开头:
"bababababababcbcdcbcbcbdcbbcbcbcbdbdbcbcbcbccbbcbbcd"
那么如何使它更优化呢?我们是否应该在上面解释“ba”的评分系统来找到 满足条件的段的最佳长度?
【问题讨论】:
-
您的向量以
1 1 1 1 1 1 1 4 4 4 4开头。算一组还是第 7 位和第 8 位的1 4是第 1 组? -
算作一组
1 4。 -
看来vector中有44个元素满足这个条件
-
还不够具体。你给出了一个向量,但你没有说正确的答案是什么。目前,可接受的运行长度 > 0.2% 的标准似乎可以接受任何运行。这是计划好的吗?
-
目前还不清楚如何处理 1111144444 和 1414141414 这两种不同的情况。不同还是等价?