【问题标题】:find similar elements in a matrix line in R在R中的矩阵行中找到相似的元素
【发布时间】:2014-03-28 10:50:00
【问题描述】:

我有一个矩阵,其中 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 范围内.所以我不想对任何数字进行四舍五入,而只是评估差异。如果公差保持在 col 29 和 col 30 以及 col 29 和 col 28 之间,那么算法应该继续检查从 col 29 到 col 27 和 col 29 到 col 31。

谢谢

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    这会找到超出公差的第一个值的位置:

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

    根据需要调整(你不说你想返回什么)。

    【讨论】:

    • 您能否整合一个案例,当搜索将到达该行的最后一列或第一列时会发生什么?那么如果该值在该行中所有值的公差范围内?
    • 此外,如果值在容差范围内,而不是超出容差范围然后再次进入,会发生什么情况?计数将需要在第一次超出公差时停止......但你采取了最大......还是我误解了?
    • 关于您的第一条评论:这不是代码生成服务。你应该自己做一些工作。但是,我已经实现了对这些情况的处理。关于您的第二条评论:是的,您误会了。 which.max 找到第一个 TRUE 值。看which.max(c(F, T, F, T))
    • 您好...好的,我明白了。我还能问你为什么将 29 硬编码到这一行吗?测试 tol;因为之后你把它写成我?作为最后一件事,您是否认为可以将其包装在应用函数中以对矩阵的几行执行此操作(映射?)
    • 这实际上只是为了使其普遍可用,而不仅仅是在中心列是 29 的情况下.....
    猜你喜欢
    • 2015-05-20
    • 1970-01-01
    • 2015-05-07
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    相关资源
    最近更新 更多