如何创建包含引号的字符串,然后解析并评估它?

时间:2015-01-23 15:55:27

标签: r string parsing eval double-quotes

我有一个包含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

2 个答案:

答案 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.tabledplyr)。

答案 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))