我有一张表格如下:
[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)应该是相同的吗?
答案 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)