Как использовать lapply, чтобы найти ближайшее значение в списке в R? - PullRequest
2 голосов
/ 24 апреля 2020

Я пытаюсь найти прогнозируемое моделью значение, наиболее близкое к реальному наблюдаемому значению в большом кадре данных. Я считаю, что мне нужно использовать lapply, но я действительно не уверен. Спасибо заранее, SE, и извините, если это повторение предыдущего поста, я посмотрел.

df <- data.frame(pred = rnorm(50, mean = 100, sd = 10),
                 cand = I(replicate(50, exp = I(list(rnorm(6, mean = 100, sd = 10))))))

До сих пор я придумал 1-строчную функцию, которая работает при запуске на одна строка, но у меня есть две проблемы:

df$closest <- sapply( df, function(x) { which.min( abs( df$pred[x] - df$cand[[x]] ) ) } )
  1. Эта функция не будет работать в полном списке, возможно, потому что я новичок в семействе apply.
  2. Эта функция возвращает позицию списка, а не фактическое значение, которое мне и нужно.

    Error in df$cand[[x]] : no such index at level 1

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

apply позволяет нам работать со строками или столбцами, потому что вы ищете l oop через строки, поле 1 (строки) должно выполнить работу!

Мы могли бы использовать apply:

df$closest <- apply( df,MARGIN = 1, function(x) { which.min( abs( x$pred - x$cand ) ) } )
1 голос
/ 24 апреля 2020

Здесь мы можем использовать Map вместо sapply, поскольку sapply зацикливается на каждом из столбцов, а значение анонимной функции x является значением этого столбца. Его нельзя использовать для индексации

df$closest <-  unlist(Map(function(x, y) which.min(abs(y - x)), df$pred, df$cand))

. Или же с sapply мы должны l oop по индексу строки

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