4

1 つの列が日時 (chron) であるデータフレームがあります。このデータフレームを、日付部分のみで分割されたデータフレームのリストに分割したいと思います。したがって、各データフレームにはその日のすべてのデータが含まれます。分割関数を見ましたが、列の値の一部を使用する方法がわかりませんか?

4

2 に答える 2

8

あなたがこれを持っているとしましょうdata.frame

    df <- data.frame(date=rep(seq.POSIXt(as.POSIXct("2010-01-01 15:26"), by="day", length.out=3), each=3), var=rnorm(9))
> df
                 date         var
1 2010-01-01 15:26:00 -0.02814237
2 2010-01-01 15:26:00 -0.26924825
3 2010-01-01 15:26:00 -0.57968310
4 2010-01-02 15:26:00  0.88089757
5 2010-01-02 15:26:00 -0.79954092
6 2010-01-02 15:26:00  1.87145778
7 2010-01-03 15:26:00  0.93234835
8 2010-01-03 15:26:00  1.29130038
9 2010-01-03 15:26:00 -1.09841234

日ごとに分割するには、次のものが必要です。

 > split(df, as.Date(df$date))
$`2010-01-01`
                 date         var
1 2010-01-01 15:26:00 -0.02814237
2 2010-01-01 15:26:00 -0.26924825
3 2010-01-01 15:26:00 -0.57968310

$`2010-01-02`
                 date        var
4 2010-01-02 15:26:00  0.8808976
5 2010-01-02 15:26:00 -0.7995409
6 2010-01-02 15:26:00  1.8714578

$`2010-01-03`
                 date        var
7 2010-01-03 15:26:00  0.9323484
8 2010-01-03 15:26:00  1.2913004
9 2010-01-03 15:26:00 -1.0984123

編集:

上記のメソッドは、datetime オブジェクトとも一致しchronます。

x <- chron(dates = "02/27/92", times = "22:29:56")
> x
[1] (02/27/92 22:29:56)
> as.Date(x)
[1] "1992-02-27"

編集2

データが変更as.Dateされないようにすることが重要です。こちらを参照してください。

# I'm using "DSTday" to make a sequece of one entire _apparent_ day
x <- rep(seq.POSIXt(as.POSIXct("2010-03-27 00:31"), by="DSTday", length.out=3))
> x
[1] "2010-03-27 00:31:00 GMT" "2010-03-28 00:31:00 GMT" "2010-03-29 00:31:00 BST"
> as.Date(x)
[1] "2010-03-27" "2010-03-28" "2010-03-28"

3 番目の項目は夏時間で、実際の日、つまりマイナス 1 時間をas.Date取得します。これを回避するには:

> as.Date(cut(x, "DSTday"))
[1] "2010-03-27" "2010-03-28" "2010-03-29"
于 2013-05-31T08:24:23.247 に答える
2

秘訣は、データを分割する方法を R に指示するベクトルを作成することです。あなたの例では、データフレームがあります:

dd = data.frame(x = runif(100),data= paste0(1:4, "/05/13"))
##This step will depend on your data structure
dd$date = strptime(dd$data, "%d/%m/%y")

日付列にクラスPOSIXlt`POSIXt` を持たせたことに注意してください。これにより、日付を簡単に操作できます。

次に、分割する変数を作成します - split_date。基本的に、他のすべての日付から最小の日付を引き、1 日の秒数で割ります。

split_date = (dd$date -min(dd$date))/86400

これは端数になるので、最も近い日に切り捨てます。

split_date = floor(split_date)

今、私splitは標準的な方法で関数を使用します:

split_by_day = split(dd, split_date)
于 2013-05-31T08:11:40.587 に答える