【问题标题】:Expanding R Matrix on Date在日期扩展 R 矩阵
【发布时间】:2017-10-31 14:04:06
【问题描述】:

我有以下 R 矩阵:

Date MyVal
2016  1
2017  2
2018  3
....
2026  10

我想要做的是“把它炸毁”,这样它就变成了这样(每月值是线性插值的):

Date        MyVal
01/01/2016    1
02/01/2016    ..
....
01/01/2017    2
....
01/01/2026    10

我意识到我可以使用以下方法轻松生成序列:

DateVec <- seq(as.Date(paste(minYear,"/01/01", sep = "")), as.Date(paste(maxYear, "/01/01", sep = "")), by = "month")

我可以用它来制作一个大矩阵,然后在 DateVector 上使用 for 循环来填充内容,但我想知道是否有更优雅的 R 方法来做到这一点?

【问题讨论】:

  • 看看?merge
  • 如果您提供reproducible example 我可以查看解决方案。
  • 检查下面的解决方案。同时,它需要根据数据集的确切结构进行一些修改(不是对最后一行,而是对数据帧准备部分)。
  • @HubertL 我很好奇如何使用merge 进行插值。这是one of my first questions here。我起初尝试使用zoomerge,但最终使用approx(使用merge 我得到的是重复的y 值而不是插值)。你会看看它,看看你是否可以用这种方法提供解决方案?会很乐意接受。此外,由于它们属于同一类别(时间序列插值),因此对这个问题也有帮助。
  • 你说得对@Masoud,我错过了“插值”...... OP 的例子也是如此

标签: r date dataframe time-series interpolation


【解决方案1】:

你可以使用stats::approx:

library(stats)

ipc <- approx(df$Date, df$MyVal, xout = DateVec, 
rule = 1, method = "linear", ties = mean)

您可能需要先将原始数据框中的数据转换为具有月份和日期,并且还要采用asPOSIXctas.Date 格式。

根据您提供的内容,这是可行的:

#Make the reference data-frame for interpolation:
DateVec <- seq(min(df$Date, na.rm=T), 
               max(df$Date, na.rm=T), by = "month")

#Interpolation:
intrpltd_df <- approx(df$Date, df$MyVal, xout = DateVec, 
          rule = 1, method = "linear", ties = mean)

#            x        y 
# 1 2016-01-01 1.000000 
# 2 2016-02-01 1.084699 
# 3 2016-03-01 1.163934 
# 4 2016-04-01 1.248634 
# 5 2016-05-01 1.330601 
# 6 2016-06-01 1.415301

数据:

#reproducing the data-frame:
Date <- seq(2016,2026)
MyVal <- seq(1:11)
Date <- data.frame(as.Date(paste0(Date,"/01/01"))) #yyyy-mm-dd format
df <- cbind(Date, MyVal)
df <- as.data.frame(df)
colnames(df) <- c ("Date", "MyVal") #Changing Column Names

【讨论】:

    猜你喜欢
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多