Приблизительный поиск в R - PullRequest
       2

Приблизительный поиск в R

8 голосов
/ 09 октября 2011

У меня есть следующая таблица поиска:

lkp <- data.frame(
         x=c(0,0.2,0.65,0.658,1.3,1.76,2.7), 
         y=c(1,1,1,0.942,0.942, 0.92, 0.89)
       )

Я хотел бы получить значение Y данного значения X.

Если значение X существует в таблице, тогда должен быть возвращен точный Y таблицы. Если значение X не существует, то значение Y должно быть возвращено как линейная интерполяция двух ближайших соседей (только двух ближайших соседей). Я не хотел бы подгонять модель к общим данным.

для приведенной выше таблицы

for X=0.2 Y=1 (exact lookup) 
for X=2 Y=0.91 (linear interpolation between the last 2 rows of the data frame)

Есть ли готовая функция для этого?

Ответы [ 2 ]

10 голосов
/ 09 октября 2011

Да, это называется approx.

> with(lkp, approx(x, y, xout=c(0.2, 2)))
$x
[1] 0.2 2.0

$y
[1] 1.0000000 0.9123404

См. ?approx для получения дополнительной информации.

0 голосов
/ 09 октября 2011

Я не думаю, что есть готовая функция для этого, но вы можете создать ее довольно легко. E.g.:

Функция для получения "соседей" (название немного вводит в заблуждение, но функция работает):

get.neighbourgs <- function(vector, x) {
diff <- vector-x
if (any(diff==0)) {
    return(which(diff==0))
    } else {
        lower <- tail(which(diff<0), 1)
        return((lower-1):lower)
    }
}

Он вернет точный «идентификатор», если значение будет найдено в vector, в противном случае он вернет два «идентификатора» (два меньших значения до этого). Это требует, чтобы ваши данные были упорядочены! Если нет, то вам нужно немного его настроить. Примеры использования:

> get.neighbourgs(lkp$x,1.3)
[1] 5
> get.neighbourgs(lkp$x,2)
[1] 5 6

Используя это, можно построить простую функцию для получения среднего значения требуемых y значений, например:

get.y <- function(df, x) {
    mean(df$y[get.neighbourgs(df$x, x)])
}

Примеры:

> get.y(lkp, 1.2)
[1] 0.971
> get.y(lkp, 2)
[1] 0.931

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...