which()具有字符类型的对象

时间:2011-11-24 15:57:06

标签: r xts

我有一些可能太基本的问题,但这里是......

我想从这样的数据集中提取月度数据:

    Date     Obs
1 2001-01-01 120
2 2001-01-02 100
3 2001-01-03 150
4 2001-01-04 175
5 2001-01-05 121
6 2001-01-06 100

我只想从我有特定月份的数据中获取行(例如1月),这非常有效:

output=which(strftime(dataset[,1],"%m")=="01",dataset[,1])

然而,当我尝试使用声明的变量创建一个循环来经历所有月份时它不起作用而且我只得到“FALSE”。

value=as.character(k)
output=which(strftime(dataset[,1],"%m")==value,dataset[,1])

3 个答案:

答案 0 :(得分:4)

将日期解析为字符串。这太容易出错了。将日期解析为日期,并对它们进行逻辑比较。

以下是一种方法,根据比较创建1月至3月的数据和2月份的子设置:

R> output <- data.frame(date=seq(as.Date("2011-01-01"), by=7, length=10), 
+                       value=cumsum(runif(10)*100))
R> output
         date     value
1  2011-01-01   8.29916
2  2011-01-08  44.82950
3  2011-01-15  72.08662
4  2011-01-22 134.19277
5  2011-01-29 221.67744
6  2011-02-05 245.77195
7  2011-02-12 314.82081
8  2011-02-19 396.34661
9  2011-02-26 437.14286
10 2011-03-05 442.41321
R> output[ output[,"date"] >= as.Date("2011-02-01") & 
+          output[,"date"] <= as.Date("2011-02-28"), ]
        date   value
6 2011-02-05 245.772
7 2011-02-12 314.821
8 2011-02-19 396.347
9 2011-02-26 437.143
R> 

另一种方法使用xts包:

R> oo <- xts(output[,"value"], order.by=output[,"date"])
R> oo
                [,1]
2011-01-01   8.29916
2011-01-08  44.82950
2011-01-15  72.08662
2011-01-22 134.19277
2011-01-29 221.67744
2011-02-05 245.77195
2011-02-12 314.82081
2011-02-19 396.34661
2011-02-26 437.14286
2011-03-05 442.41321
R> oo["2011-02-01::2011-02-28"]
               [,1]                 
2011-02-05 245.772
2011-02-12 314.821
2011-02-19 396.347
2011-02-26 437.143
R> 

因为xts具有方便的索引日期解析;有关详细信息,请参阅包文档。

答案 1 :(得分:3)

我假设k1:12中的整数。我怀疑你使用缩写的月份名称可能会更好:

value <- month.abb[k]
output <- which(strftime(dataset[,1],"%b")==value,dataset[,1])

您无法使用的原因是因为月份编号为零填充且"1" != "01"

答案 2 :(得分:2)

您还可以将日期用作POSIXlt()$mon

的日期
as.POSIXlt(output$date)$mon  # Note that Jan = 0 and Feb=1
 [1] 0 0 0 0 0 1 1 1 1 2

还有其他一些软件包,如chron,lubridate和gdata,它们提供日期处理功能。我发现lubridate中的函数特别直观,而且在我笨拙的手中不容易出错。