【问题标题】:r - insert row for missing monthly data and interpolater - 为缺失的月度数据插入行并进行插值
【发布时间】:2015-10-01 17:32:53
【问题描述】:

我有一个如下的数据框,其中包含 5000 多行。我正在尝试插入缺少月份的行,例如下面第 6 个月 - 然后利用线性插值计算“TWS”值。理想情况下,十进制日期也将适当填写,但如果没有,我可以在之后对其进行排序!数据框是 10 年(2003-2012 年)的月份 1:12,但对于多个网格方块重复。

我发现了许多其他类似的问题,但与重复的每月 1:12 序列无关。

 > head(ts.data,20)
    GridNo GridIndex  Lon  Lat DecimDate Year Month        TWS
 1    GR72        72 35.5 -4.5  2003.000 2003    01 14.2566781
 2    GR72        72 35.5 -4.5  2003.083 2003    02  5.0413706
 3    GR72        72 35.5 -4.5  2003.167 2003    03  3.8192721
 4    GR72        72 35.5 -4.5  2003.250 2003    04  5.8706026
 5    GR72        72 35.5 -4.5  2003.333 2003    05  7.8461188
 6    GR72        72 35.5 -4.5  2003.500 2003    07  2.3821844
 7    GR72        72 35.5 -4.5  2003.583 2003    08  0.1995629
 8    GR72        72 35.5 -4.5  2003.667 2003    09 -1.8353604
 9    GR72        72 35.5 -4.5  2003.750 2003    10 -2.0410653
 10   GR72        72 35.5 -4.5  2003.833 2003    11 -1.4029813
 11   GR72        72 35.5 -4.5  2003.917 2003    12 -0.2206872
 12   GR72        72 35.5 -4.5  2004.000 2004    01 -0.5090872
 13   GR72        72 35.5 -4.5  2004.083 2004    02 -0.4887118
 14   GR72        72 35.5 -4.5  2004.167 2004    03 -0.7725966
 15   GR72        72 35.5 -4.5  2004.250 2004    04  4.1831581
 16   GR72        72 35.5 -4.5  2004.333 2004    05  2.5651040
 17   GR72        72 35.5 -4.5  2004.417 2004    06 -2.2511409
 18   GR72        72 35.5 -4.5  2004.500 2004    07 -1.6484375
 19   GR72        72 35.5 -4.5  2004.583 2004    08 -4.6508982
 20   GR72        72 35.5 -4.5  2004.667 2004    09 -5.0053745

任何帮助表示赞赏!

【问题讨论】:

  • 2004 年第 9 个月之后的几个月呢?你通常失踪几个月?例如,如果您在某年结束时缺少 5 个月,您想如何进行插值?
  • 您找到了哪些答案,为什么它们不适合您?是否有可能多于一个月的失踪?这项任务似乎很琐碎,确切的问题是什么?插入新行,插值?
  • @DavidArenburg 他只显示前几行......你是什么意思?
  • 也许您可以考虑追加而不是插入缺失的月份。这对于插值无关紧要。如果您以需要排序的 data.frame 的方式执行此操作,则始终可以在附加丢失的数据后对其进行排序。
  • @DavidArenburg - 数据系列在 2003-2012 年间每月持续。然后,在 28.5 到 35.5 经度和 -4.5 到 0.5 纬度之间每 1 度 * 1 度网格单元重复 10 年的数据。在 2003-2012 年期间,有多个单月缺失。

标签: r dataframe time-series missing-data


【解决方案1】:

使用 data.tablezoo 包,您可以轻松地扩展数据集并进行插值,只要您没有 NAs 两种大小的年份

扩展数据集

library(data.table)
library(zoo)
res <- setDT(df)[, .SD[match(1:12, Month)], by = Year]

在你想要的任何列上插入

cols <- c("Month", "DecimDate", "TWS")
res[, (cols) := lapply(.SD, na.approx, na.rm = FALSE), .SDcols = cols]

res
#     Year GridNo GridIndex  Lon  Lat DecimDate Month        TWS
#  1: 2003   GR72        72 35.5 -4.5  2003.000     1 14.2566781
#  2: 2003   GR72        72 35.5 -4.5  2003.083     2  5.0413706
#  3: 2003   GR72        72 35.5 -4.5  2003.167     3  3.8192721
#  4: 2003   GR72        72 35.5 -4.5  2003.250     4  5.8706026
#  5: 2003   GR72        72 35.5 -4.5  2003.333     5  7.8461188
#  6: 2003     NA        NA   NA   NA  2003.417     6  5.1141516
#  7: 2003   GR72        72 35.5 -4.5  2003.500     7  2.3821844
#  8: 2003   GR72        72 35.5 -4.5  2003.583     8  0.1995629
#  9: 2003   GR72        72 35.5 -4.5  2003.667     9 -1.8353604
# 10: 2003   GR72        72 35.5 -4.5  2003.750    10 -2.0410653
# 11: 2003   GR72        72 35.5 -4.5  2003.833    11 -1.4029813
# 12: 2003   GR72        72 35.5 -4.5  2003.917    12 -0.2206872
# 13: 2004   GR72        72 35.5 -4.5  2004.000     1 -0.5090872
# 14: 2004   GR72        72 35.5 -4.5  2004.083     2 -0.4887118
# 15: 2004   GR72        72 35.5 -4.5  2004.167     3 -0.7725966
# 16: 2004   GR72        72 35.5 -4.5  2004.250     4  4.1831581
# 17: 2004   GR72        72 35.5 -4.5  2004.333     5  2.5651040
# 18: 2004   GR72        72 35.5 -4.5  2004.417     6 -2.2511409
# 19: 2004   GR72        72 35.5 -4.5  2004.500     7 -1.6484375
# 20: 2004   GR72        72 35.5 -4.5  2004.583     8 -4.6508982
# 21: 2004   GR72        72 35.5 -4.5  2004.667     9 -5.0053745
# 22: 2004     NA        NA   NA   NA        NA    NA         NA
# 23: 2004     NA        NA   NA   NA        NA    NA         NA
# 24: 2004     NA        NA   NA   NA        NA    NA         NA

【讨论】:

  • 感谢您为此付出的努力。您上面的输出正是我所需要的,但是我无法让它工作(可能我犯了简单的错误)。我得到了这个输出...onedrive.live.com/… ....有没有办法让原始文件工作...onedrive.live.com/…感谢您的耐心等待!
【解决方案2】:

我会先将您的日期转换为实际日期(这里取每个月的第一天:

dates <- as.Date(paste(ts.data$Year, ts.data$Month, 1, sep="-"))

对目标做同样的事情,缺少几个月(这里只有一个,但可以与多个一起工作):

target <- as.Date("2003-06-01")

然后做近似:

approx(dates, ts.data$TWS, target)
$x
[1] "2003-06-01"

$y
[1] 5.069365

所以在你的数据框的上下文中(这里是简化的):

ts.data <- data.frame(Year=c(rep(2003,11),rep(2004,9)),Month=c((1:12)[-6],1:9),TWS=c(14.2566781,5.0413706,3.8192721,5.8706026,7.8461188, 2.3821844, 0.1995629,-1.8353604,-2.0410653,-1.4029813,-0.2206872,-0.5090872,-0.4887118,-0.7725966, 4.1831581, 2.5651040,-2.2511409,-1.6484375,-4.6508982, -5.0053745))
dates <- as.Date(paste(ts.data$Year, ts.data$Month, 1, sep="-"))
target <- as.Date("2003-06-01")
ts.data <- rbind(ts.data, 
                 data.frame(Year=2003, 
                            Month=6, 
                            TWS=approx(dates, ts.data$TWS, target)$y)
ts.data <- ts.data[order(ts.data$Year, ts.data$Month),]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    相关资源
    最近更新 更多