问题描述
我正在处理一个 1501 x 35 值的数据框,数据如下表所示:
日期 | 1 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|
10/02/20 | 0.04919382 | 0.04962555 | 0.04579872 | 0.0354689 | 0.048592 |
20/05/20 | 0.04909930 | 0.04957330 | 0.0458772 | 0.04741 | 0.052167 |
12/08/20 | 0.04909930 | 0.04957330 | 0.04525272 | 0.035544 | 0.045489 |
18/10/20 | 0.04915135 | 0.04957330 | 0.047822 | 0.03485484 | 0.024452 |
我想通过插值获得“第 2 列”的数据。
我试过 result<- approx(data$1,data$2,xout = data$2,method = 'linear')
但是没有用,结果是错误的。我也尝试过 approxfun
,但它返回 50 个值而不是 1501。我该如何进行正确的线性插值?
非常感谢。
解决方法
我相信你想要的是这个。目前没有什么可插值的,您首先需要一个 NA
列。您可以在第二个位置之后 append
一个。
(d <- as.data.frame(append(d,list(X2=NA),2)))
# Date X1 X2 X3 X4 X5 X6
# 1 2020-02-10 0.04919382 NA 0.04962555 0.04579872 0.03546890 0.048592
# 2 2020-05-20 0.04909930 NA 0.04957330 0.04587720 0.04741000 0.052167
# 3 2020-08-12 0.04909930 NA 0.04957330 0.04525272 0.03554400 0.045489
# 4 2020-10-18 0.04915135 NA 0.04957330 0.04782200 0.03485484 0.024452
现在您想按行apply
approx
函数,即使用 MARGIN=1
。逻辑是,您向它提供要插入的值的长度序列,即每个 x
迭代的 apply
,即 seq(x)
以及包含 { {1}} 是 NA
本身。从输出中您需要 x
,并且由于它是整个(转置)矩阵,因此只需行 y
。
[2,]
数据:
d$X2 <- apply(d[-1],MARGIN=1,function(x) approx(seq(x),x,seq(x))$y)[2,]
d
# Date X1 X2 X3 X4 X5 X6
# 1 2020-02-10 0.04919382 0.04940968 0.04962555 0.04579872 0.03546890 0.048592
# 2 2020-05-20 0.04909930 0.04933630 0.04957330 0.04587720 0.04741000 0.052167
# 3 2020-08-12 0.04909930 0.04933630 0.04957330 0.04525272 0.03554400 0.045489
# 4 2020-10-18 0.04915135 0.04936232 0.04957330 0.04782200 0.03485484 0.024452