103

次のようなデータセットがあります。

Month    count
2009-01  12
2009-02  310
2009-03  2379
2009-04  234
2009-05  14
2009-08  1
2009-09  34
2009-10  2386

データをプロットしたい (月を x 値、カウントを y 値として)。データに欠落があるので、月の情報を日付に変換したい。私は試した:

as.Date("2009-03", "%Y-%m")

しかし、うまくいきませんでした。どうしたの?1日もかかるようでas.Date()、1日の基準値が設定できないのでは?どの関数が私の問題を解決しますか?

4

7 に答える 7

88

日付は数値と開始日に対応するため、実際に日が必要です。データを日付形式にする必要がある場合は、日付に貼り付けて、手動で毎月の最初の日を修正することができます。

month <- "2009-03"
as.Date(paste(month,"-01",sep=""))
于 2011-06-05T12:46:15.123 に答える
64

これを試して。(ここではtext=Lines例を自己完結型にするために使用していますが、実際にはファイル名に置き換えます。)

Lines <- "2009-01  12
2009-02  310
2009-03  2379
2009-04  234
2009-05  14
2009-08  1
2009-09  34
2009-10  2386"

library(zoo)
z <- read.zoo(text = Lines, FUN = as.yearmon)
plot(z)

このデータでは X 軸はあまりきれいではありませんが、実際にはもっと多くのデータがある場合は問題ないかもしれません?plot.zoo

z上記で作成された動物園シリーズ には"yearmon"時間インデックスがあり、次のようになります。

> z
Jan 2009 Feb 2009 Mar 2009 Apr 2009 May 2009 Aug 2009 Sep 2009 Oct 2009 
      12      310     2379      234       14        1       34     2386 

"yearmon"単独でも使用できます。

> as.yearmon("2000-03")
[1] "Mar 2000"

ノート:

  1. "yearmon"クラス オブジェクトはカレンダー順に並べ替えられます。

  2. これにより、毎月のポイントが等間隔でプロットされます。これはおそらく必要なことです。ただし、各月の日数に比例した不等間隔でポイントをプロットする必要がある場合は、 のインデックスz"Date"クラス: に変換しますtime(z) <- as.Date(time(z))

于 2011-06-05T12:58:02.803 に答える
6

実際、上記 (および SO の他の場所) で述べたように、文字列を日付に変換するには、月の特定の日付が必要です。as.Date()マニュアルページから:

日付文字列が日付を完全に指定していない場合、返される回答はシステム固有のものである可能性があります。最も一般的な動作は、欠落している年、月、または日が現在のものであると想定することです。日付が正しく指定されていない場合、信頼できる実装ではエラーが発生し、日付は NA として報告されます。残念ながら、一部の一般的な実装 ( などglibc) は信頼性が低く、意図した意味を推測します。

"01"簡単な解決策は、日付を各日付に貼り付け、を使用strptime()してその月の最初の日として示すことです。


R での日付と時刻の処理についてもう少し背景を知りたい場合:

R では、時間を使用POSIXctし、POSIXltクラスと日付でクラスを使用しDateます。

日付は 1970 年 1 月 1 日からの日数として保存され、時刻は 1970 年 1 月 1 日からの秒数として保存されます。

たとえば、次のようになります。

d <- as.Date("1971-01-01")
unclass(d)  # one year after 1970-01-01
# [1] 365

pct <- Sys.time()  # in POSIXct
unclass(pct)  # number of seconds since 1970-01-01
# [1] 1450276559
plt <- as.POSIXlt(pct)
up <- unclass(plt)  # up is now a list containing the components of time
names(up)
# [1] "sec"    "min"    "hour"   "mday"   "mon"    "year"   "wday"   "yday"   "isdst"  "zone"  
# [11] "gmtoff"
up$hour
# [1] 9

日付と時刻の操作を実行するには:

plt - as.POSIXlt(d)
# Time difference of 16420.61 days

日付を処理するには、次を使用できますstrptime()(これらの例はマニュアルページから借用):

strptime("20/2/06 11:16:16.683", "%d/%m/%y %H:%M:%OS")
# [1] "2006-02-20 11:16:16 EST"

# And in vectorized form:
dates <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")
strptime(dates, "%d%b%Y")
# [1] "1960-01-01 EST" "1960-01-02 EST" "1960-03-31 EST" "1960-07-30 EDT"
于 2015-12-17T16:28:07.687 に答える
1

@ ben-rollert の解決策は良い解決策だと思います。

このソリューションを新しいパッケージ内の関数で使用する場合は注意が必要です。

パッケージを開発するときは、構文を使用することをお勧めしますpackagename::function_name()( http://kbroman.org/pkg_primer/pages/depends.htmlを参照)。

この場合、ライブラリas.Date()によって定義されたバージョンを使用する必要があります。zoo

例を次に示します。

> devtools::session_info()
Session info ----------------------------------------------------------------------------------------------------------------------------------------------------
 setting  value                       
 version  R version 3.3.1 (2016-06-21)
 system   x86_64, linux-gnu           
 ui       RStudio (1.0.35)            
 language (EN)                        
 collate  C                           
 tz       <NA>                        
 date     2016-11-09                  

Packages --------------------------------------------------------------------------------------------------------------------------------------------------------

 package  * version date       source        
 devtools   1.12.0  2016-06-24 CRAN (R 3.3.1)
 digest     0.6.10  2016-08-02 CRAN (R 3.2.3)
 memoise    1.0.0   2016-01-29 CRAN (R 3.2.3)
 withr      1.0.2   2016-06-20 CRAN (R 3.2.3)

> as.Date(zoo::as.yearmon("1989-10", "%Y-%m")) 
Error in as.Date.default(zoo::as.yearmon("1989-10", "%Y-%m")) : 
  do not know how to convert 'zoo::as.yearmon("1989-10", "%Y-%m")' to class “Date”

> zoo::as.Date(zoo::as.yearmon("1989-10", "%Y-%m"))
[1] "1989-10-01"

したがって、パッケージを開発している場合は、以下を使用することをお勧めします。

zoo::as.Date(zoo::as.yearmon("1989-10", "%Y-%m"))
于 2016-11-09T13:31:07.090 に答える