2011-03-04 50 views
13

Tôi có một dữ liệu thời tiết theo giờ theo định dạng sau:Tập hợp dữ liệu theo giờ vào uẩn hàng ngày

Date,MaxDBT,MinDBT,AveDBT 
01/01/2000,36,23,28 
01/02/2000,34,22,29 
01/03/2000,32,25,30 
... 
... 
12/31/2000,35,9,20 

:

Date,DBT 
01/01/2000 01:00,30 
01/01/2000 02:00,31 
01/01/2000 03:00,33 
... 
... 
12/31/2000 23:00,25 

Những gì tôi cần một tổng hợp hàng ngày của max, min, ave như thế này là Làm thế nào để làm điều này trong R?

+7

thời gian tới, cung cấp các bảng dữ liệu trong một định dạng readible, ví dụ như sử dụng dput() hoặc cho các code Runnable cung cấp các dữ liệu như tôi đã giới thiệu trong câu trả lời của tôi. –

+0

Sau khi đọc các câu trả lời được đề xuất, tôi tự hỏi liệu nó không thể được thực hiện bằng cách sử dụng cơ sở R chỉ. –

Trả lời

18

1) Điều này có thể được thực hiện gọn sử dụng zoo:

L <- "Date,DBT 
01/01/2000 01:00,30 
01/01/2000 02:00,31 
01/01/2000 03:00,33 
12/31/2000 23:00,25" 

library(zoo) 
stat <- function(x) c(min = min(x), max = max(x), mean = mean(x)) 
z <- read.zoo(text = L, header = TRUE, sep = ",", format = "%m/%d/%Y", aggregate = stat) 

Điều này cho phép:

> z 
      min max  mean 
2000-01-01 30 33 31.33333 
2000-12-31 25 25 25.00000 

2) đây là một giải pháp mà chỉ sử dụng lõi R:

DF <- read.csv(text = L) 
DF$Date <- as.Date(DF$Date, "%m/%d/%Y") 
ag <- aggregate(DBT ~ Date, DF, stat) # same stat as in zoo solution 

Dòng cuối cùng cho:

> ag 
     Date DBT.min DBT.max DBT.mean 
1 2000-01-01 30.00000 33.00000 31.33333 
2 2000-12-31 25.00000 25.00000 25.00000 

CHỈNH SỬA: (1) Vì lần đầu tiên này xuất hiện đối số text= thành read.zoo đã được thêm vào gói sở thú. (2) cải tiến nhỏ.

+0

@Grothendieck: +1 Tôi chưa bao giờ nhận ra rằng bạn có thể bỏ thông tin hàng giờ bằng cách không chỉ rõ thông tin đó trong as.Date(). –

+0

Im nhìn vào điều này từ điện thoại nhưng Id đặt cược rằng giải pháp 'aggregate' cho một cột danh sách mà bạn không thể thực sự sử dụng cho bất cứ điều gì trừ khi bạn sẽ quấn toàn bộ điều vào' do.call (cbind.data.frame, aggregate ... ' –

+0

Nó tạo ra một data.frame có cột đầu tiên là 'ag $ Date' và cột thứ hai là ma trận' ag $ DBT' có các cột là '" min "', '" max "' và '" mean "'. Nó dễ dàng chuyển đổi thành một loạt sở thú bằng cách sử dụng 'read.zoo (ag)'. –

5

Sử dụng strptime(), trunc()ddply() từ gói plyr:

#Make the data 
ZZ <- textConnection("Date,DBT 
01/01/2000 01:00,30 
01/01/2000 02:00,31 
01/01/2000 03:00,33 
12/31/2000 23:00,25") 
dataframe <- read.csv(ZZ,header=T) 
close(ZZ) 

# Do the calculations 
dataframe$Date <- strptime(dataframe$Date,format="%m/%d/%Y %H:%M") 
dataframe$day <- trunc(dataframe$Date,"day") 

require(plyr) 

ddply(dataframe,.(day), 
     summarize, 
     aveDBT=mean(DBT), 
     maxDBT=max(DBT), 
     minDBT=min(DBT) 
) 

cho

  day aveDBT maxDBT minDBT 
1 2000-01-01 31.33333  33  30 
2 2000-12-31 25.00000  25  25 

Để làm rõ:

strptime chuyển đổi nhân vật để ngày theo định dạng. Để xem cách bạn có thể chỉ định định dạng, hãy xem ?strptime. trunc sau đó sẽ cắt bớt các ngày giờ này thành đơn vị được chỉ định, là ngày trong trường hợp này.

ddply sẽ đánh giá hàm summarize trong khung dữ liệu sau khi chia nhỏ theo day. mọi thứ sau summarize là các đối số được chuyển đến hàm summarize.

+1

Bạn có thực sự cần trình bao bọc xung quanh 'tóm tắt' không? –

+0

@Sacha: thực sự, không cần điều đó, thx để sửa. Bắt đầu trễ ở đây ... –

2

Ngoài ra còn có một gói tốt đẹp được gọi là HydroTSM. Nó sử dụng các đối tượng sở thú và có thể chuyển đổi thành các tập hợp khác trong thời gian

Hàm trong trường hợp của bạn là phụ hàng ngày. Bạn có thể chọn nếu tập hợp dựa trên min/max/mean ...

0

Bạn có thể sử dụng gói tidyquant cho việc này. Quá trình này liên quan đến việc sử dụng hàm tq_transmute để trả về một khung dữ liệu được sửa đổi bằng cách sử dụng hàm tổng hợp xts, apply.daily. Chúng tôi sẽ áp dụng một tùy chỉnh stat_fun, trả về giá trị tối thiểu, tối đa và trung bình. Tuy nhiên, bạn có thể áp dụng bất kỳ hàm vectơ nào bạn muốn như quantile.

library(tidyquant) 

df 
#> # A tibble: 4 x 2 
#>     Date DBT 
#>    <dttm> <dbl> 
#> 1 2000-01-01 01:00:00 30 
#> 2 2000-01-01 02:00:00 31 
#> 3 2000-01-01 03:00:00 33 
#> 4 2000-12-31 23:00:00 25 

stat_fun <- function(x) c(min = min(x), max = max(x), mean = mean(x)) 

df %>% 
    tq_transmute(select  = DBT, 
       mutate_fun = apply.daily, 
       FUN  = stat_fun) 
# A tibble: 2 x 4 
#>     Date min max  mean 
#>    <dttm> <dbl> <dbl> <dbl> 
#> 1 2000-01-01 03:00:00 30 33 31.33333 
#> 2 2000-12-31 23:00:00 25 25 25.00000 
Các vấn đề liên quan