我正在寻找一种通用的算法,从列表中识别最大长度为几百个数字的短数字序列。这将用于从质谱(ms1)数据中识别一系列质量。
例如,给出下面的列表,我想确定这些数字中的3个符合序列N+ 1,N +2,等等。
426.24 <= N
427.24 <= N + 1/x
371.10
428.24 <= N + 2/x
851.47
451.16这些序列的格式都是: N,N+1/x,N+2/x,N+3/x,N+4/x等,其中x是一个整数(在示例x=1中)。我认为这个约束使得这个问题非常容易处理。在R中有什么建议可以快速有效地解决这个问题吗?
发布于 2016-06-01 08:12:09
此例程将使用从1到10的x生成序列(您可以增加它)。并且将检查在原始数字列表中包含了多少。
N = c(426.24,427.24,371.1,428.24,851.24,451.16)
N0 = N[1]
x = list(1,2,3,4,5,6,7,8,9,10)
L = 20
Series = lapply(x, function(x){seq(from = N0, by = 1/x,length.out = L)})
countCoincidences = lapply(Series, function(x){sum(x %in% N)})结果:
unlist(countCoincidences)
[1] 3 3 3 3 3 3 3 3 3 2如您所见,使用x=1将有3次重合。所有的x都是一样的,直到x=9。这里你必须决定哪个x是你想要的。
发布于 2016-06-01 08:32:00
因为你在寻找一个算术序列,所以差k是常量。因此,您可以遍历向量并从序列中减去每个值。如果你有一个序列,从向量中减去第二项将得到值-k,0和k,所以你可以通过查找向量值和它的对立面值向量之间的匹配来找到序列:
x <- c(426.24, 427.24, 371.1, 428.24, 851.47, 451.16)
unique(lapply(x, function(y){
s <- (x - y) %in% (y - x);
if(sum(s) > 1){x[s]}
}))
# [[1]]
# NULL
#
# [[2]]
# [1] 426.24 427.24 428.24https://stackoverflow.com/questions/37557387
复制相似问题