Интерполировать точки данных в r - PullRequest
0 голосов
/ 18 января 2019

У меня есть датафрейм, который выглядит так:

# Dataframe
set.seed(1)
df <- data.frame(a=c('foo', 'foo', 'bar', 'bar'), 
                 b=c('baz', 'baz', 'quz', 'quz'),
                 c=as.Date(c("2018-01-01", "2018-04-04")), 
                 d=c(1, 4, 1, 4), 
                 e=runif(4))

Я интерполирую данные следующим образом:

# Split to do lapply
l <- split(df, df$a)

# Interpolate
l2 <- lapply(l, 
             function(x) approx(x = x$d, 
                                y = x$e, 
                                xout = c(2, 3)))

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

Желаемый результат:

    a   b   c           d   e
1   foo baz 2019-01-01  1   0.2655087
2   foo baz NA          2   0.3010471
3   foo baz NA          3   0.3365855
4   foo baz 2019-04-04  4   0.3721239
5   bar quz 2019-01-01  1   0.5728534
6   bar quz NA          2   0.6846382
7   bar quz NA          3   0.7964230
8   bar quz 2019-04-04  4   0.9082078

1 Ответ

0 голосов
/ 18 января 2019

Вот способ. Он использует два внешних пакета, data.table и zoo.

l3 <- data.table::rbindlist(l2, idcol = TRUE)
names(l3)[1:3] <- c("a", "d", "e")
res <- merge(df, l3, all = TRUE)
res[[4]] <- zoo::na.locf(res[[4]])
res <- res[sort(names(res))]
res
#    a   b          c d         e
#1 bar quz 2018-01-01 1 0.5728534
#2 bar quz       <NA> 2 0.6846382
#3 bar quz       <NA> 3 0.7964230
#4 bar quz 2018-04-04 4 0.9082078
#5 foo baz 2018-01-01 1 0.2655087
#6 foo baz       <NA> 2 0.3010471
#7 foo baz       <NA> 3 0.3365855
#8 foo baz 2018-04-04 4 0.3721239
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...