[英]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.