линейная интерполяция значений NA в R - PullRequest
1 голос
/ 18 апреля 2020

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

Например, вторая построенная строка выглядит так:

v1 <- unlist(test[2,])
plot(v1[!is.na(v1)], names(v1)[!is.na(v1)], type="l", add = TRUE)

enter image description here

Как можно go про интерполировать / аппроксимировать значения NA вдоль оси x в этом случае? Любые предложения в базе R или dplyr были бы полезны

test
  variable 26500 30000 30100 30700 31600 33700 33800 33900 34000 34600 34800 35100 35200 35300
1      -20    NA     0    NA    NA    10    20    NA    NA    NA    30    NA    NA    NA    NA
2      -10    NA     0    NA    NA    NA    10    NA    NA    NA    20    NA    NA    NA    30
3        0     0    NA    NA    NA    NA    NA    10    NA    NA    NA    20    NA    NA    NA
4       24    NA    NA    NA     0    NA    NA    NA    NA    10    NA    NA    NA    20    NA
5       40    NA    NA     0    NA    NA    NA    NA    10    NA    NA    NA    20    NA    NA
6       55    NA    NA     0    NA    NA    NA    NA    10    NA    NA    NA    20    NA    NA
  35400 35600 35800 35900 36200 36300 36400 36700 36900 37000 37200 37800 37900 38000 38200
1    40    NA    NA    NA    50    NA    NA    NA    NA    NA    60    NA    NA    NA    70
2    NA    NA    NA    40    NA    NA    NA    50    NA    NA    NA    60    NA    NA    NA
3    NA    30    NA    NA    40    NA    NA    NA    50    NA    NA    NA    60    NA    NA
4    NA    NA    30    NA    NA    40    NA    NA    NA    50    NA    NA    NA    60    NA
5    NA    NA    30    NA    NA    40    NA    NA    NA    50    NA    NA    NA    NA    60
6    NA    NA    NA    30    NA    NA    40    NA    NA    50    NA    NA    NA    NA    60
  38800 39000 39100 39200 39700 39800 39900 40000 40200 40600 40700 40800 41700 41800
1    NA    NA    NA    80    NA    NA    NA    NA    90    NA    NA    NA   100    NA
2    70    NA    NA    NA    80    NA    NA    NA    NA    90    NA    NA   100    NA
3    70    NA    NA    NA    NA    80    NA    NA    NA    NA    90    NA   100    NA
4    NA    70    NA    NA    NA    NA    NA    80    NA    NA    NA    90   100    NA
5    NA    NA    70    NA    NA    NA    NA    80    NA    NA    NA    90    NA   100
6    NA    70    NA    NA    NA    NA    80    NA    NA    NA    NA    90   100    NA

Вот пример данных:

dput(test)
structure(list(variable = c(-20, -10, 0, 24, 40, 55), `26500` = c(NA, 
NA, 0L, NA, NA, NA), `30000` = c(0L, 0L, NA, NA, NA, NA), `30100` = c(NA, 
NA, NA, NA, 0L, 0L), `30700` = c(NA, NA, NA, 0L, NA, NA), `31600` = c(10L, 
NA, NA, NA, NA, NA), `33700` = c(20L, 10L, NA, NA, NA, NA), `33800` = c(NA, 
NA, 10L, NA, NA, NA), `33900` = c(NA, NA, NA, NA, 10L, 10L), 
    `34000` = c(NA, NA, NA, 10L, NA, NA), `34600` = c(30L, 20L, 
    NA, NA, NA, NA), `34800` = c(NA, NA, 20L, NA, NA, NA), `35100` = c(NA, 
    NA, NA, NA, 20L, 20L), `35200` = c(NA, NA, NA, 20L, NA, NA
    ), `35300` = c(NA, 30L, NA, NA, NA, NA), `35400` = c(40L, 
    NA, NA, NA, NA, NA), `35600` = c(NA, NA, 30L, NA, NA, NA), 
    `35800` = c(NA, NA, NA, 30L, 30L, NA), `35900` = c(NA, 40L, 
    NA, NA, NA, 30L), `36200` = c(50L, NA, 40L, NA, NA, NA), 
    `36300` = c(NA, NA, NA, 40L, 40L, NA), `36400` = c(NA, NA, 
    NA, NA, NA, 40L), `36700` = c(NA, 50L, NA, NA, NA, NA), `36900` = c(NA, 
    NA, 50L, NA, NA, NA), `37000` = c(NA, NA, NA, 50L, 50L, 50L
    ), `37200` = c(60L, NA, NA, NA, NA, NA), `37800` = c(NA, 
    60L, NA, NA, NA, NA), `37900` = c(NA, NA, 60L, NA, NA, NA
    ), `38000` = c(NA, NA, NA, 60L, NA, NA), `38200` = c(70L, 
    NA, NA, NA, 60L, 60L), `38800` = c(NA, 70L, 70L, NA, NA, 
    NA), `39000` = c(NA, NA, NA, 70L, NA, 70L), `39100` = c(NA, 
    NA, NA, NA, 70L, NA), `39200` = c(80L, NA, NA, NA, NA, NA
    ), `39700` = c(NA, 80L, NA, NA, NA, NA), `39800` = c(NA, 
    NA, 80L, NA, NA, NA), `39900` = c(NA, NA, NA, NA, NA, 80L
    ), `40000` = c(NA, NA, NA, 80L, 80L, NA), `40200` = c(90L, 
    NA, NA, NA, NA, NA), `40600` = c(NA, 90L, NA, NA, NA, NA), 
    `40700` = c(NA, NA, 90L, NA, NA, NA), `40800` = c(NA, NA, 
    NA, 90L, 90L, 90L), `41700` = c(100L, 100L, 100L, 100L, NA, 
    100L), `41800` = c(NA, NA, NA, NA, 100L, NA)), row.names = c(NA, 
-6L), class = "data.frame")

1 Ответ

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

Мы могли бы использовать na.interp из forecast

library(forecast)
test[-1] <- t(apply(test[-1], 1, na.interp))

Или с na.approx

test[-1] <- t(apply(test[-1], 1, na.approx, na.rm = FALSE))

, а затем сделать построение

v1 <- unlist(test[2, -1])
plot(v1, names(v1), type = 'l')

enter image description here

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