2017-09-19 48 views
0

我每天时间序列数据帧,我要转换为包月,按以下格式:的R - 每天每月的时间序列 - 重复天

DATE VALOR 
3/5/2014 8.9 
3/5/2014 50 
3/5/2014 50 
3/6/2014 77.4 
3/7/2014 97.95 
3/8/2014 118.5 
3/8/2014 139.05 
3/8/2014 159.6 
3/10/2014 180.15  
3/11/2014 200.7 

可以看出,天都没有在数据库中均匀重复。最好的方法是什么?除此之外,VALOR列应该是一个SUM,而不是一个MEAN。

回答

1

假设所有的时间序列在data.frame应该由sum()汇总那么可以尝试:

library(data.table) 
setDT(df) 
df[, lapply(.SD, sum), by = format(DATE, "%Y-%m")] 

一个小例子:

df <- data.frame(DATE = seq(as.Date("2016-01-01"), length.out = 100, by = 1) 
       , x1 = 1:100, x2 = 1:100) 
library(data.table) 
setDT(df) 
df[, lapply(.SD, sum), by = .(Date = format(DATE, "%Y-%m"))] 
     Date x1 x2 
1: 2016-01 496 496 
2: 2016-02 1334 1334 
3: 2016-03 2356 2356 
4: 2016-04 864 864 
+0

感谢。解决了。 –

0

所以,如果我正确地理解它,你想按月分组(并假设年份也一样)。使用dplyr

df %>% 
mutate(month = format(date, "%m"), year = format(date, "%Y")) %>% 
group_by(month, year) %>% 
summarise(total_sum = sum(value)) 
0

读它使用动物园创建动物园对象显示。指数将是一个年份对象,它直接代表年/月。

注意,不像使用字符串来表示年/月这给出了一个年/月,可以被操纵(例如,一个一个月添加到它,与剧情和ggplot使用它,等)

library(zoo) 
z <- read.zoo(df, FUN = as.yearmon, format = "%m/%d/%Y", aggregate = sum) 

给:

> z 
Mar 2014 
1082.25 

如果你需要一个数据帧的结果使用fortify.zoo(z)

注:输入可复制的形式假设为:

Lines <- " 
DATE VALOR 
3/5/2014 8.9 
3/5/2014 50 
3/5/2014 50 
3/6/2014 77.4 
3/7/2014 97.95 
3/8/2014 118.5 
3/8/2014 139.05 
3/8/2014 159.6 
3/10/2014 180.15  
3/11/2014 200.7" 
df <- read.table(text = Lines, header = TRUE)