根据列值在表中查找匹配值

时间:2014-02-11 15:37:59

标签: r

我有一张表格如下:

[1,] 1 6 8 0.09457250 0.09457250 0.09457450 0.09457250 0.094572200 0.094572200
[2,] 1 3 7 0.04620798 0.04620798 0.04620998 0.04620798 0.046207681 0.046207681
[3,] 2 5 4 0.00160710 0.00160710 0.00160710 0.00160710 0.001607281 0.001607281
[4,] 6 6 8 0.09457250 0.09457250 0.09457450 0.09457250 0.094572200 0.094572200
[5,] 7 3 7 0.04620798 0.04620798 0.04620998 0.04620798 0.046207681 0.046207681
[6,] 12 5 4 0.00160710 0.00160710 0.00160710 0.00160710 0.001607281 0.001607281

[1,] 0.0945722 0.0945722 0.0945722 0.5171163 0.5171163 0.5171168 0.5171168
[2,] 0.9078313 0.5171163 0.5171163 0.5171163 0.4969045 0.4969050 0.4969050
[3,] 0.0016076 0.0016076 0.0016076 0.0016076 0.0016078 0.0016083 0.0016083
[4,] 0.0945722 0.0945722 0.0945722 0.5171163 0.5171163 0.5171168 0.5171168
[5,] 0.9078313 0.5171163 0.5171163 0.5171163 0.4969045 0.4969050 0.4969050
[6,] 0.0016076 0.0016076 0.0016076 0.0016076 0.0016078 0.0016083 0.0016083

[1,] 0.5171168 1.7740327 1.7740327 1.3879578 1.0062008 1.0062010 1.0062010
[2,] 0.4969050 0.4969109 0.4969109 0.4969050 0.4969050 0.4969050 1.0062010
[3,] 0.0016083 0.0016142 0.0016142 0.0016083 0.0016083 0.0016083 0.0016073
[4,] 0.5171168 1.7740327 1.7740327 1.3879578 1.0062008 1.0062010 1.0062010
[5,] 0.4969050 0.4969109 0.4969109 0.4969050 0.4969050 0.4969050 1.0062010
[6,] 0.0016083 0.0016142 0.0016142 0.0016083 0.0016083 0.0016083 0.0016073

出于计算目的,可以忽略前3列。但第一列存储了重要信息。如果值为12,则表示从第12列开始(如果不计算前3列)或第15列(如果它们被考虑在内)并查看该行(本例中为第6行)到右侧和左侧(第6行) ,第12列)用于拉伸10e-5(正或负)值范围内的值。重要的是记下结果

column1 column2 column3 StartofStretch End of Stretch
12       5       4       1               20

其中第1,2,3列是原始的前3列。重要的是它对序列中某个时间稍后/早期的数字是稳健的(在1e5容差中) 为了解决这个问题,我之前尝试过

f <- function(x){
  v <- x[4:length(x)]
  m <- which(v == v[x[1]] )
  return(c(start=min(m),stop=max(m)))
}
q <-cbind(p[,1:3],t(apply(p,1,f)))

然而,这并没有考虑我所谈到的容差,并且不一定考虑在拉伸结束后数字是否出现(在第12列左右延伸到右边和左边的2和然后相同的数字出现在拉伸右侧的7或8个左右,这个方法只会在观察到这样的值时计算极值。

修改

所以我的小规模数据集是

    t                                                                  
[1,] 1 23 20 0.008352330 0.008352572 0.008352330 0.008352330 0.008351730
[2,] 1 17 28 0.020770380 0.020770622 0.020770380 0.020770380 0.020769780
[3,] 1  4 12 0.006003570 0.006003812 0.006003570 0.006003570 0.006002970
[4,] 1 11 13 0.005008098 0.005008340 0.005008518 0.005008518 0.005007918
[5,] 1  3 10 0.006530800 0.006531042 0.006530800 0.006530800 0.006531300
[6,] 1 19 22 0.003711100 0.003711342 0.003711100 0.003711100 0.00371160

the output of lukeA's script  
         t       lower upper    expedected lower   expectupper
    [1,] 1 23 20     1     1         1                5
    [2,] 1 17 28     1     5         1                4
    [3,] 1  4 12     1     4         1                5
    [4,] 1 11 13     1     2          1               5
    [5,] 1  3 10     1     5          1               5
    [6,] 1 19 22     1     4         1               5

这不正确,因为在第3行(为了说明),第7列和第8列之间的差异是-6×10到7的幂,然后应该在范围内....我误解了什么? 同样在第1行,如果灵敏度是4位小数,那么第3列和第4列(如果不计算输出中的前三位,则为1和2)应该是相同的吗?

1 个答案:

答案 0 :(得分:0)

这是一个快速的&amp;脏的(mat占据你的桌子):

f <- function(row, tol=4) {
  a <- unname(signif(mat[row, -(1:3)], tol))
  i <- mat[row, 1]
  l <- which(!a == a[i])
  upper <- l[which(l > i)[1]] - 1
  lower <- tail(l[which(l < i)], 1) + 1
  if (is.na(upper)) upper <- length(a)
  if (length(lower) == 0) lower <- 1
  return(c(lower=lower, upper=upper))
}
(res <- t(mapply(f, 1:nrow(mat))))
#      lower upper
# [1,]     1     9
# [2,]     1     6
# [3,]     1     6
# [4,]     1     9
# [5,]     7     7
# [6,]     7    14
cbind(mat[, 1:3], res)