我有一个与插值有关的问题。我有2列($ 1是以秒为单位的时间,另一个是海平面)。我尝试过的示例主要来自日期列,例如1970-11-11,但是我有一些要线性插值到分钟的记录(以秒为单位)。最初是每0.3秒采样一次。请问关于哪个软件包最好的建议?在下面的代码中,它将生成一个大矩阵,但不会像预期的那样减少值的数量。格式仅为2列。试图用于进一步分析,而不是每0.1秒而是每1分钟对数据进行一次采样。
set.seed(1);
time <- rep(seq(0,180,by=0.1));
sl <-runif(1801,-0.1,4.0);
data1 <- cbind2(time,sl);
#Output needed...
time(min) sl(cm)
#Examples tried:
time<-data1$V1
SL<-data1$V2
seq1 <- zoo(order.by=((seq(min(time), max(time), by=30))))
mer1 <- merge(zoo(x=data1[1:2],order.by=time), seq1)
#Linear interpolation
dataL <- na.approx(mer1)
这里是一个解决方案。这种方法不使用任何线性插值,而是以每分钟为中心取平均值。
library(dplyr) # for group_by and summarize
colnames(data1) <- c("time", "sl") # makes it easier to call variables by names
data1 <- as.data.frame(data1)
data1$minute <- round(data1$time/60,0) #
head(data1)
# time sl minute
# 1 0.0 0.9885855 0
# 2 0.1 1.4257080 0
# 3 0.2 2.2486988 0
# 4 0.3 3.6236519 0
# 5 0.4 0.7268959 0
# 6 0.5 3.5833977 0
data_by_minute <- data1 %>%
group_by(minute) %>%
summarize(sl_avg = mean(sl))
data_by_minute
# # A tibble: 4 x 2
# minute sl_avg
# <dbl> <dbl>
# 1 0 1.91
# 2 1 1.98
# 3 2 1.87
# 4 3 1.96
如果您只想每分钟获取一次实际读数,而不是计算平均值,则可以使用另一种方法:
data1[data1$time%%60==0,] # only returns the observations on the minute. throws everything else out
# time sl
# 1 0 0.9885855
# 601 60 3.2384322
# 1201 120 1.4027590
# 1801 180 0.1525986
或者如果您正在寻找一个内插值,则可以使用:
minutes <- time/60 # calculate minutes based on the time variable
mod_leoss <- loess(minutes~sl) # fit a loess model to your data, this is essentially a smoothed version of your sl data based on time
Minute <- c(0,1,2,3) # minutes for which you want a predicaiton
SL_Preds <- predict(mod_leoss, Minute) # calculate values from the model
tableA <- cbind(Minute, SL_Preds)
tableA
# Minute SL_Preds
# [1,] 0 1.665899
# [2,] 1 1.463291
# [3,] 2 1.445809
# [4,] 3 1.498165