我有一个数据框,其中一列是日期时间(chron)。我想将此数据帧拆分为仅由日期部分拆分的数据帧列表。因此,每个数据帧都将包含当天的所有数据。我看了分割函数,但不知道如何使用部分列值?
答案 0 :(得分:6)
说你有这个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
日期时间对象一致:
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"
答案 1 :(得分:1)
诀窍是创建一个向量,告诉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
。基本上,我从所有其他日期中减去最小日期除以一天中的秒数:
split_date = (dd$date -min(dd$date))/86400
由于这将导致分数,我将向下舍入到最近的一天:
split_date = floor(split_date)
现在我以标准方式使用split
函数:
split_by_day = split(dd, split_date)