na.approx Интерполяция в R - PullRequest
1 голос
/ 23 апреля 2020

Я использую na.approx Zoo для заполнения значений NA.

library(zoo)
Bus_data<-data.frame(Action = c("Boarding", "Alighting",NA, NA,"Boarding", "Alighting",NA, NA,"Boarding", "Alighting"),
Distance=c(1,1,2,2,3,3,4,4,5,5),
Time = c(1,2,NA,NA,5,6,NA,NA,9,10))

Мне бы хотелось, чтобы результирующий элемент data.frame выглядел следующим образом:

      Action Distance Time
1   Boarding        1    1
2  Alighting        1    2
3         NA        2   3.5
4         NA        2   3.5
5   Boarding        3    5
6  Alighting        3    6
7         NA        4   7.5
8         NA        4   7.5
9   Boarding        5    9
10 Alighting        5   10

Однако , когда я использую

na.approx(Bus_data$Time,Bus_data$Distance,ties = "ordered" )
1   Boarding        1    2 <-Value Changes
2  Alighting        1    2
3         NA        2   3.5
4         NA        2   3.5
5   Boarding        3    6 <-Value Changes
6  Alighting        3    6
7         NA        4   7.5
8         NA        4   7.5
9   Boarding        5   10 <-Value Changes
10 Alighting        5   10

Есть идеи, как я могу получить желаемый результат с помощью na.approx? Обратите внимание, что в примере «Расстояние» равномерно распределено для упрощения, набор данных имеет различные расстояния.

Ответы [ 2 ]

3 голосов
/ 23 апреля 2020

Вы можете использовать approx от baseR

Time = c(1,2,NA,NA,5,6,NA,NA,9,10)
approx(Time, method = "constant", n = length(Time), f = .5)$y

Результат

# [1]  1.0  2.0  3.5  3.5  5.0  6.0  7.5  7.5  9.0 10.0

От ?approx

f : для method = "constant" число от 0 до 1 включительно, указывающее на компромисс между пошаговыми функциями слева и справа. Если y0 и y1 являются значениями слева и справа от точки, то значение равно y0, если f == 0, y1, если f == 1, и y0 * (1-f) + y1 * f для промежуточных значений. Таким образом, результат является непрерывным справа для f == 0 и непрерывным слева для f == 1, даже для не конечных значений y.


При na.approx это будет быть похожим

library(zoo)
na.approx(Time, method = "constant", f = .5)
2 голосов
/ 23 апреля 2020

Мы могли бы replace элементы не-NA исходного столбца до NA после na.approx, а затем сделать coalesce

library(dplyr)
library(zoo)
coalesce(Bus_data$Time, replace(na.approx(Bus_data$Time,Bus_data$Distance,
            ties = "ordered" ), 
        !is.na(Bus_data$Time), NA))
#[1]  1.0  2.0  3.5  3.5  5.0  6.0  7.5  7.5  9.0 10.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...