我有一个矩阵,其中1行看起来像
[1] 3.630380e-04 2.508100e-04 2.397480e-04 3.583060e-04 1.352502e-03
[6] 3.615660e-04 1.070212e-04 1.851614e-03 4.862520e-04 3.133680e-05
[11] 1.509084e-03 1.971120e-04 9.395720e-05 2.467100e-03 3.695440e-05
[16] 4.840520e-04 9.587220e-05 3.482520e-03 2.580140e-04 4.161880e-03
[21] 1.826980e-04 3.016000e-03 3.177400e-03 1.281218e-04 8.437420e-04
[26] 1.823138e-03 9.580200e-04 9.907120e-04 2.582140e-03 2.205160e-04
[31] 6.575000e-05 1.875756e-03 3.671640e-04 2.528060e-05 4.163980e-04
[36] 7.939280e-04 2.894380e-04 2.474960e-04 2.101340e-04 2.241000e-03
[41] 1.254614e-04 5.975560e-04 7.159760e-05 3.125960e-04 1.311358e-03
[46] 4.742180e-04 7.947780e-07 2.819960e-04 5.153660e-04 4.901420e-04
[51] 2.108020e-03 1.122480e-03 6.398160e-04 8.454800e-04 3.870840e-05
[56] 4.835640e-04 1.311954e-03 6.320340e-06 3.058540e-03 5.186800e-04
我想从第i列开始(我将在此特定行的第29列)并转到右侧和左侧,并检测该值在列29的值10e-4内保留的列数所以我不想围绕任何数字,而只是评估差异。如果公差保持在第29栏和第30栏以及第29栏和第28栏之间,则算法应继续检查第29栏至第27栏和第29栏至第31栏。
谢谢
答案 0 :(得分:0)
这会找到超出公差范围的第一个值的位置:
x <- c(3.630380e-04,2.508100e-04,2.397480e-04,3.583060e-04,1.352502e-03,
3.615660e-04,1.070212e-04,1.851614e-03,4.862520e-04,3.133680e-05,
1.509084e-03,1.971120e-04,9.395720e-05,2.467100e-03,3.695440e-05,
4.840520e-04,9.587220e-05,3.482520e-03,2.580140e-04,4.161880e-03,
1.826980e-04,3.016000e-03,3.177400e-03,1.281218e-04,8.437420e-04,
1.823138e-03,9.580200e-04,9.907120e-04,2.582140e-03,2.205160e-04,
6.575000e-05,1.875756e-03,3.671640e-04,2.528060e-05,4.163980e-04,
7.939280e-04,2.894380e-04,2.474960e-04,2.101340e-04,2.241000e-03,
1.254614e-04,5.975560e-04,7.159760e-05,3.125960e-04,1.311358e-03,
4.742180e-04,7.947780e-07,2.819960e-04,5.153660e-04,4.901420e-04,
2.108020e-03,1.122480e-03,6.398160e-04,8.454800e-04,3.870840e-05,
4.835640e-04,1.311954e-03,6.320340e-06,3.058540e-03,5.186800e-04)
search.fun <- function(x, i, tol) {
test <- (x - x[i]) > tol
a <- head(test, i)
lwr <- if (any(a)) i - which.max(rev(a)) + 1 else -Inf
b <- tail(test, -i)
upr <- if (any(b)) i + which.max(b) else Inf
setNames(c(lwr, upr), c("lwr", "upr"))
}
search.fun(x, 29, 5e-5)
#lwr upr
#23 59
这里我假设RAM不是问题。此外,如果向量很大且预期间隔非常小,则使用for
循环可能更有效。
根据需要进行调整(您不会说出要返回的内容)。