簡體   English   中英

在R中,我如何按日期拆分數據框

[英]In R how can I split a dataframe by date

我有一個數據框,其中一列是日期時間(chron)。 我想將此數據框拆分為僅按日期部分拆分的數據框列表。 因此,每個數據幀都將包含當天的所有數據。 我查看了拆分功能,但不確定如何使用部分列值?

說你有這個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

編輯:

上面的方法也與chron datetime對象一致:

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"

第三項是在夏季時間和as.Date檢索實際日期,即減去一小時。 為了避免這種情況

> as.Date(cut(x, "DSTday"))
[1] "2010-03-27" "2010-03-28" "2010-03-29"

訣竅是創建一個向量,告訴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")

請注意,我已經使date列具有POSIXlt類。 這樣可以輕松操作日期。

接下來我將創建我要拆分的變量 - split_date 基本上,我從所有其他日期中減去最小日期並除以一天中的秒數:

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

由於這將導致分數,我將向下舍入到最近的一天:

split_date = floor(split_date)

現在我以標准方式使用split函數:

split_by_day = split(dd, split_date)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM