2013-05-31 4 views
2

У меня есть dataframe, где один столбец - это время даты (chron). Я хотел бы разбить этот файл данных на список разделов данных, разделенных только частью даты. Таким образом, каждый файл данных будет иметь все данные за этот день. Я посмотрел на функцию разделения, но не уверен, как использовать часть значения столбца?В R как я могу разделить данные по дате

ответ

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 

EDIT:

выше метод согласуется с 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" 

EDIT 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" 
+0

У меня есть дате времени, хотя мне нужно сохранить информацию о времени. – Mark

+0

@Mark просто используйте 'as.Date', или, может быть, вы можете опубликовать образец, чтобы фактически запустить код, и поэтому вы увидите, что мой метод работает ... – Michele

+0

@Mark и теперь? :-) – Michele

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) 
+0

Благодарим за это, надеялся, что вы сможете передать функцию в раскол, которая получила часть даты, когда она раскололась, но я думаю, нет. – Mark

+0

Я думаю, что 'strptime (dd $ data,"% d /% m /% Y ")' должно быть 'strptime (dd $ data,"% d /% m /% y ")' – Michele

+0

@Michele Спасибо – csgillespie