在R中插值数据框点

时间:2019-01-18 19:42:58

标签: r

我有一个看起来像这样的数据框:

# 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 :(得分:1)

这是一种方法。它使用两个外部软件包data.tablezoo

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