繁体   English   中英

R中的内插/外推

[英]Interpolation/ Extrapolation in R

我有一个数据集,其中“值”列的天数持续时间有所变化。

开始结束值日
24-03-2011 24-05-2011 398 60
25-05-2011 21-07-2011 275 56
22-07-2011 13-09-2011 389 52
14-09-2011 18-11-2011 482 64
19-11-2011 13-01-2012 514 54
2012年1月14日2012年2月19日330
20-02-2012 12-04-2012 519 51
13-04-2012 24-05-2012 361 40
25-05-2012 24-06-2012 202 29

我需要的是“价值”列的“月度数据”,例如“月度分布”

开始结束值日
2011年1月3日至2011年3月31日? 31
2011年1月4日至2011年4月30日? 30
2011年1月5日至2011年5月31日? 31
2011年1月6日至2011年6月30日? 30
2011年1月7日至2011年7月31日? 31
2011年1月8日至2011年8月31日? 31
2011年1月9日至2011年9月30日? 30
2011年1月10日至2011年10月31日? 31
2011年11月11日? 30
2011年1月12日到2011年12月31日? 31
2012年1月1日至2012年1月31日? 31
2012年1月2日至2012年2月29日? 29
2012年1月3日至2012年3月31日? 31
2012年1月4日2012年4月30日? 30

我不知道它的插值/外插问题,但是我被建议使用这些方法。 请帮忙

您可以使用此处接受的解决方案按日扩展数据框架:

library(data.table)
df2 <- setDT(df)[, list(Value = Value, 
                        date = seq(from = Start, to = End, length.out = Days)), 
                 by = 1:nrow(df)]

> df2
     nrow Value       date
  1:    1   398 2011-03-24
  2:    1   398 2011-03-25
  3:    1   398 2011-03-26
  4:    1   398 2011-03-27
  5:    1   398 2011-03-28
 ---                      
750:   16   371 2013-04-11
751:   16   371 2013-04-12
752:   16   371 2013-04-13
753:   16   371 2013-04-14
754:   16   371 2013-04-16

假设您要在开始到结束的所有天中平均分配原始数据框中的每个值,则可以执行以下操作:

library(dplyr)
library(lubridate)

df2 %>%

  # calculate average for each day
  group_by(nrow) %>%
  mutate(Value = Value / n()) %>%
  ungroup() %>%

  # summarize by month
  mutate(Month = format(date, "%Y-%m")) %>%
  group_by(Month) %>%
  summarise(Value = sum(Value)) %>%
  ungroup() %>%

  # derive start / end dates for each month
  mutate(Start = ymd(paste0(Month, "-1"))) %>%
  mutate(End = Start %m+% months(1) - 1) %>% 
  mutate(Days = End - Start + 1) %>% 
  select(Start, End, Value, Days) 

# A tibble: 26 x 4
        Start        End     Value    Days
       <date>     <date>     <dbl>  <time>
 1 2011-03-01 2011-03-31  53.06667 31 days
 2 2011-04-01 2011-04-30 192.36667 30 days
 3 2011-05-01 2011-05-31 186.94167 31 days
 4 2011-06-01 2011-06-30 142.41071 30 days
 5 2011-07-01 2011-07-31 173.02198 31 days
 6 2011-08-01 2011-08-31 224.42308 31 days
 7 2011-09-01 2011-09-30 217.80048 30 days
 8 2011-10-01 2011-10-31 225.93750 31 days
 9 2011-11-01 2011-11-30 242.25347 30 days
10 2011-12-01 2011-12-31 285.55556 31 days
# ... with 16 more rows

数据:

df <- read.table(
  header = T,
  stringsAsFactors = F, 
  text = "Start       End        Value  Days
24-03-2011  24-05-2011  398   60
25-05-2011  21-07-2011  275   56
22-07-2011  13-09-2011  389   52
14-09-2011  18-11-2011  482   64
19-11-2011  13-01-2012  514   54
14-01-2012  19-02-2012  330   35
20-02-2012  12-04-2012  519   51
13-04-2012  24-05-2012  361   40
25-05-2012  24-06-2012  202   29
25-05-2012  06-08-2012  691   72
07-08-2012  23-09-2012  376   46
24-09-2012  06-11-2012  300   42
07-11-2012  21-12-2012  272   43
22-12-2012  31-01-2013  276   39
01-02-2013  02-03-2013  188   28
03-03-2013  16-04-2013  371   43"
)

df$Start = as.Date(df$Start, "%d-%m-%Y")
df$End = as.Date(df$End, "%d-%m-%Y")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM