在R中的矩阵行中找到相似的元素

时间:2014-03-28 10:50:00

标签: r matrix

我有一个矩阵,其中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栏。

谢谢

1 个答案:

答案 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循环可能更有效。

根据需要进行调整(您不会说出要返回的内容)。