从星期一开始每周将数据汇总到每周级别

时间:2015-05-18 12:42:31

标签: r time-series aggregate-functions

我有一个像

这样的数据框
2015-01-30     1       Fri
2015-01-30     2       Sat
2015-02-01     3       Sun
2015-02-02     1       Mon
2015-02-03     1       Tue
2015-02-04     1       Wed 
2015-02-05     1       Thu
2015-02-06     1       Fri
2015-02-07     1       Sat
2015-02-08     1       Sun

我希望将其汇总到每周级别,以便每周从"星期一"并在" sunday"结束。因此,在上面的汇总数据中,第一周应该在2015-02-01结束。

输出应该看起来像上面的东西

firstweek    6  
secondweek   7

我试过了,

data <- as.xts(data$value,order.by=as.Date(data$interval))
weekly <- apply.weekly(data,sum)

但是在最后的结果中,每周都是从星期日开始。

3 个答案:

答案 0 :(得分:2)

转换为日期并使用%W格式获取周数...

df <- read.csv(textConnection("2015-01-30,     1,       Fri,
2015-01-30,     2,       Sat,
2015-02-01,     3,       Sun,
2015-02-02,     1,       Mon,
2015-02-03,     1,       Tue,
2015-02-04,     1,       Wed,
2015-02-05,     1,       Thu,
2015-02-06,     1,       Fri,
2015-02-07,     1,       Sat,
2015-02-08,     1,       Sun"), header=F, stringsAsFactors=F)
names(df) <- c("date", "something", "day")
df$date <- as.Date(df$date, format="%Y-%m-%d")
df$week <- format(df$date, "%W")
aggregate(df$something, list(df$week), sum)

答案 1 :(得分:1)

这应该有效。我已经调用了数据框m并将列命名为与您的列不同。

library(plyr) # install.packages("plyr")

colnames(m) = c("Date", "count","Day")
start  = as.Date("2015-01-26")
m$Week <- floor(unclass(as.Date(m$Date) - as.Date(start)) / 7) + 1
m$Week = as.numeric(m$Week)
m %>% group_by(Week) %>% summarise(count = sum(count))

库plyr非常适合数据处理,但它只是一个粗略的黑客来获取周数。

答案 2 :(得分:1)

凭借dplyr

功能,智能lubridateisoweek非常简单
my.df <- read.table(header=FALSE, text=
  '2015-01-30     1       Fri
   2015-01-30     2       Sat
   2015-02-01     3       Sun
   2015-02-02     1       Mon
   2015-02-03     1       Tue
   2015-02-04     1       Wed 
   2015-02-05     1       Thu
   2015-02-06     1       Fri
   2015-02-07     1       Sat
   2015-02-08     1       Sun')
 my.df %>% mutate(week = isoweek(V1)) %>% group_by(week) %>% summarise(sum(V2))

或稍短一点

my.df %>% group_by(isoweek(V1)) %>% summarise(sum(V2))