Я работаю с фреймом данных, в котором отсутствуют некоторые данные, и мне нужно интерполировать пустые значения, используя линейную интерполяцию.
Хотя я знаю, что могу сделать это с помощью al oop, я ' Я хотел бы сделать это, используя dplyr
(для согласованности и читабельности и потому, что я знаю, что циклы ужасно уродливы в R ).
Вот пример того, что я пытаюсь сделать:
data.raw <- tibble(x=c(66, 67, 68, 69, 70, 72, 73, 75, 93),
S=c(0.11755811, 0.11648940, 0.11542069, 0.11434199,
0.11218459, 0.10996312, 0.10884104, 0.10767071,
0.09228918))
# As you can see, there are some "holes" in the data. For example, the value
# for x = 71 is missing.
# I've created a new dataframe with all the values for x as this:
data.proc <- tibble(x=66:(data.raw %>% select(x) %>% pull() %>% max)) %>%
left_join(data.raw, by='x')
# Here's my non optimal 'for' solution:
for(x_ in data.proc$x) {
if(is.na(data.proc[data.proc$x == x_, 'S'])) {
# Get min and max values for x
x.0 <- max(data.proc[data.proc$x < x_, 'x'])
x.1 <- min(data.proc[data.proc$x > x_, 'x'])
S.0 <- data.proc[data.proc$x == x.0, 'S']
S.1 <- data.proc[data.proc$x == x.1, 'S']
# Calculate the slope
m <- (S.1 - S.0) / (x.1 - x.0)
# Set the new value
data.proc[data.proc$x == x_, 'S'] <- m * (x_ - x.0) + S.0
}
}
Итак, мой вопрос: есть ли способ сделать это напрямую с dplyr
? До сих пор ми гугл-фу меня подводит: (