我有一个看起来像这样的数据框:
# 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
答案 0 :(得分:1)
这是一种方法。它使用两个外部软件包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