我有一个包含3年销售数据的数据框,我试图将其转换为时间序列。为36个月中的每一个手动创建子集:
mydfJan2011 <- subset(myDataFrame,
as.Date("2011-01-01") <= myDataFrame$Dates &
myDataFrame$Dates <= as.Date("2011-01-31"))
...
mydfDec2013 <- subset(myDataFrame,
as.Date("2013-12-01") <= myDataFrame$Dates &
myDataFrame$Dates <= as.Date("2013-12-31"))
然后将它们相加并将它们放入矢量
counts[1] <- sum(mydfJan2011$itemsSold)
...
counts[36] <- sum(mydfDec2013$itemsSold))
获取时间序列的值可以正常工作,但我想让它更自动,因为我必须创建多个时间序列,所以我试图把它变成一个循环。
为了做到这一点,我需要创建一个带有子命令的字符串,如下所示:
"subset(myDataFrame,
as.Date("2011-01-01") <= myDataFrame$Dates &
myDataFrame$Dates <= as.Date("2011-01-31"))"
但是当我使用粘贴时,结果如下:
myString
>"subset(myDataFrame, as.Date(\"2011-02-01\") <= myDataFrame$Dates & myDataFrame$Dates <= as.Date(\"2011-02-28\"))"
和
eval(parse(text = myString))
导致以下错误消息:
Error in charToDate(x) :
character string is not in a standard unambiguous format
而只是输入命令(没有转义)会导致我尝试创建的子集。
我尝试使用单引号和双引号,替换和解析,但没有一个会导致我的数据框的任何类型的子集。
有什么建议吗?
即使是按月分割数据并将其总结的另一种方式也是受欢迎的。
谢谢, SIGNE
答案 0 :(得分:2)
以下是使用tapply
的解决方案:
with(sales, tapply(itemsSold, substr(Dates, 1, 7), sum))
每月产生一笔款项(为了说明的目的,我将我的数据限制在9个月,但这延长了更长时间):
2011-01 2011-02 2011-03 2011-04 2011-05 2011-06 2011-07 2011-08 2011-09
1592.097 1468.427 1594.386 1563.014 1595.489 1560.361 1553.128 1663.705 1325.519
tapply
计算向量(sales$sales
)中值的总和,该向量按另一个向量(substr(sales$date, 1, 7)
的值分组,基本上是“yyyy-mm”)。 with
允许我避免反复输入sales$
。您几乎不必使用eval(parse(...))
。几乎总有一种更好,更快的方法来做到这一点而不诉诸于此。
以下是我使用的数据:
set.seed(1)
sales <- data.frame(Dates=seq(as.Date("2011-01-01"), as.Date("2011-09-30"), by="+1 day"))
sales$itemsSold <- runif(nrow(sales), 1, 100)
作为参考,还有一些第三方软件包可以简化此类计算(请参阅data.table
,dplyr
)。
答案 1 :(得分:1)
这是一种data.table
方法,按月和月汇总,使用当月的第一个作为相应的组标签:
library(data.table)
##
mDt <- Dt[
,list(monthSold=sum(itemsSold)),
keyby=list(mDay=as.Date(paste0(
year(Dates),"-",month(Dates),"-01")))]
##
R> head(mDt)
mDay monthSold
1: 2012-01-01 179
2: 2012-02-01 128
3: 2012-03-01 152
4: 2012-04-01 160
5: 2012-05-01 152
6: 2012-06-01 141
数据:
set.seed(123)
Dt <- data.table(
Dates=seq.Date(
from=as.Date("2012-01-01"),
to=as.Date("2014-12-31"),
by="day"),
itemsSold=rpois(1096,5))