2014-02-11 3 views
-1

У меня есть таблица, которая выглядит следующим образом:Найти подходящее значение в таблице на основе значения столбца

[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 или около того столбцов справа от растяжения этот метод будет просто учитывать крайности, когда такое значение будет наблюдаться.

EDIT

Таким образом мой небольшой набор данных шкалы

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 -6times10to мощности минус 7, который должен затем быть в диапазоне. ... что я неправильно понял? Также в строке 1, если чувствительность соответствует 4-значному значению после запятой, тогда столбцы 3 и 4 (или 1 и 2, если вы не считаете первые три, как на выходе) должны быть одинаковыми?

+0

кто-то может указать, Что не ясно? – user3069326

+1

В чем вопрос? Что ты пытаешься сделать? Какие важные заметки? Что вы пробовали? Тогда будет легче ответить на что-то – Llopis

+0

Это действительно о шаблоне соответствия из столбца 12 (в данном случае) – user3069326

ответ

0

Вот быстрый & грязный (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) 
+0

это большой @lukeA. Coul Я спрашиваю, обнаруживает ли он в обоих направлениях или только вперед от столбца, указанного первой колонкой? # – user3069326

+0

@ user3069326 оба. ps: Возможно, вы захотите использовать '(res <- t (mapply (f, 1: nrow (mat), 3)))', чтобы получить желаемый допуск. – lukeA

+0

Не могли бы вы рассказать мне, где добавить это в ваш oce .. или кратко обновить его..i woudl be very gratefu – user3069326

Смежные вопросы