2011-01-13 90 views
7

Nói rằng tôi có ma trận sau:Tính trung bình hàng ngày trong R

x1 = 1:288 
x2 = matrix(x1,nrow=96,ncol=3) 

Có một cách dễ dàng để có được giá trị trung bình của dòng 1: 24,25: 48,49: 72,73: 96 cho cột 2?

Về cơ bản tôi có chuỗi thời gian một năm và tôi phải tính trung bình một số dữ liệu sau mỗi 24 giờ.

Trả lời

8

Có.

Giả sử chúng ta có những ngày:

Days <- rep(1:4,each=24) 

bạn có thể làm một cách dễ dàng

tapply(x2[,2],Days,mean) 

Nếu bạn có một dataframe với một biến ngày, bạn có thể sử dụng một trong đó. Bạn có thể làm điều đó cho tất cả các biến cùng một lúc, sử dụng tổng hợp:

x2 <- as.data.frame(cbind(x2,Days)) 
aggregate(x2[,1:3],by=list(Days),mean) 

Hãy xem các tệp trợ giúp của các chức năng này để bắt đầu. Cũng đừng tìm kiếm ở đây, có khá một số câu trả lời thú vị khác trên vấn đề này:

PS: Nếu bạn đang đi để làm rất nhiều chuỗi thời gian, bạn nên hãy xem gói zoo (trên CRAN: http://cran.r-project.org/web/packages/zoo/index.html)

+0

@SnowFrog Bạn đã sai. tapply không tạo ra một khung dữ liệu. Nó tạo ra một vector (trong trường hợp này). Sự khác biệt lớn. –

+0

Một vấn đề với phương thức 'tapply' là nó tạo ra một vectơ (số cột = số ngày).Phương thức 'aggregate' tạo ra một khung dữ liệu (1 cột với số hàng = số ngày), có thể thực tế hơn nếu thao tác sau đó của dữ liệu là cần thiết. – SnowFrog

2

Cách nhỏ gọn và tính toán nhanh chóng để thực hiện việc này là định hình lại vectơ thành ma trận phù hợp và tính cột ans.

colMeans(matrix(x2[,2],nrow=24)) 
+0

giải pháp sạch, miễn là không có dữ liệu bị thiếu ở bất kỳ đâu. Nếu không, ma trận sẽ không đại diện cho ngày. –

+0

Bạn cần phải cẩn thận với phương pháp này để kích thước phù hợp. Nhưng bạn có thể xử lý dữ liệu bị thiếu bằng cách sử dụng NA cho những người dùng và sử dụng na.rm = TRUE –

+0

Tôi biết rằng :-) Tôi có nghĩa là mất tích theo nghĩa "không phải mỗi ngày có 24 hàng dữ liệu" –

4

1) ts. Do đây là một chuỗi thời gian thường xuyên khoảng cách, chuyển nó sang một loạt ts và sau đó tổng hợp nó từ tần số từ 24 đến tần số 1:

> aggregate(ts(x2[, 2], freq = 24), 1, mean) 

cho:

Time Series: 
Start = 1 
End = 4 
Frequency = 1 
[1] 108.5 132.5 156.5 180.5 

2) sở thú. Ở đây nó đang sử dụng sở thú. Gói sở thú cũng có thể xử lý hàng loạt khoảng cách bất thường (nếu chúng ta cần mở rộng này). Dưới đây day.hour là số ngày (1, 2, 3, 4) cộng với giờ như là một phần nhỏ trong ngày để floor(day.hour) là chỉ số trong ngày:

> library(zoo) 
> day.hour <- seq(1, length = length(x2[, 2]), by = 1/24) 
> z <- zoo(x2[, 2], day.hour) 
> aggregate(z, floor, mean) 
    1  2  3  4 
108.5 132.5 156.5 180.5 

Nếu zz là sản phẩm sau đó coredata(zz)time(zz) là các giá trị và thời gian, tương ứng, như các vectơ thông thường.

+0

+1 để hiển thị làm thế nào để sử dụng sở thú và ts cho điều đó. Tôi đã không đề cập đến nó như tôi không muốn thừa nhận quá nhiều về dữ liệu trong vấn đề thực sự, nhưng nó chắc chắn là có liên quan và hữu ích. –

Các vấn đề liên quan