首页 > 解决方案 > 如何在 R 中外推/内插

问题描述

我正在尝试内插/外推 NA 值。我拥有的数据集来自一个测量站,该测量站每 5 分钟测量 4 个深度的土壤温度。在此特定示例中,在 0 cm 深度变量和 1-5 cm 深度变量的测量结束时存在错误数据 (-888.88)。我将其转换为 NA。现在我的教授希望我对这个和我拥有的所有其他数据集进行插值/外推。我知道在最后一次观察之后推断出如此多的值可能在统计上不准确,但我试图至少想出一个工作代码。截至目前,我试图推断其中一个变量(SoilTemp_1.5cm)。最后一行运行,但是当我打开数据框时,NA 仍然存在。

library(dplyr)
library(Hmisc)

MyD <- read.csv("2319538_Bodentemp_braun_WILDKOGEL_17_18 - Copy.csv",header=TRUE, sep=";")

MyD$date <- as.Date(MyD$Date, "%d.%m.%Y")
MyD$datetime <- as.POSIXct(MyD$Date.Time..GMT.01.00, format = "%d.%m.%Y %H:%M")

MyD[,-c(1,2,3,4,9)][MyD[,-c(1,2,3,4,9)] == -888.88] <- NA #convert erroneous data to NA


MyD %>%  mutate(`SoilTemp_1.5cm`=approxExtrap(x=SoilTemp_5cm, y=SoilTemp_1.5cm, xout=SoilTemp_5cm)$y)

我也尝试过这种方式,当我转换为数据框时,它给了我一个包含很多列而不是行的 2 列表。我不会说这个 approxExtrap 语法让我有点困惑。

MyD1 <- approxExtrap(MyD$SoilTemp_5cm, MyD$SoilTemp_1.5cm,xout=MyD$SoilTemp_5cm)
MyD1

老实说,我不确定如何重现数据,所以这里是 dput() 输出https://pastebin.com/NFZdmm4L的 pastebin 链接。我试图包含尽可能多的输出。请记住,我在运行 dput() 时排除了一些列,因此代码MyD[,-c(1,2,3,4,9)][MyD[,-c(1,2,3,4,9)] == -888.88]可能会有所不同。无论如何, dput() 输出已经包含了 NA,因此您甚至可能不需要它。

提前致谢。

此致,

佐林

标签: rdplyrinterpolationzoohmisc

解决方案


na.approx 将使用插值填充 NA,而 rule=2 将扩展第一个和最后一个值。

library(zoo)

x <- c(NA, 4, NA, 5, NA) # test input

na.approx(x, rule = 2)
## [1] 4.0 4.0 4.5 5.0 5.0

推荐阅读