2011-11-24 41 views
1

我有一個問題,可能是太基本的,但在這裏它是字符類型的對象......其中()與

我想從這樣的數據集中提取的月度數據:

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]) 

但是當我嘗試創建一個循環使用一個變量,通過所有月份去日在宣佈有字符它不起作用,我只會得到「假」。

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

回答

4

不是解析日期爲字符串。這太容易出錯。將日期解析爲日期,並對它們進行邏輯比較。

這是一種方法,創造一月至三月的數據,並根據比較子設置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擁有方便的日期解析索引;有關詳細信息,請參閱包文檔。

3

我假設k1:12整數。我懷疑你可能使用月份的縮寫會更好:

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

你的方式是不工作的原因是因爲該月數是零填充和"1" != "01"

+0

是的,它是(1至12),我忘了它。一個非常基本的錯誤,我忘記了我有01到12,而不是1到12.謝謝! –

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 

還有其他幾個包,如克隆氏病,lubridate和GDATA提供日期處理功能。我發現lubridate中的函數特別直觀,並且在我笨拙的手中不易出錯。

+0

+1 - 這是一個很好的評論,但我討厭關於POSIX月份表示的一件事是0到11的範圍。在C編程級別罰款,在R中不太好。 –