Bagaimana cara mengumpulkan data menit selama seminggu ke dalam sarana per jam?

15

Bagaimana Anda mendapatkan sarana per jam untuk beberapa kolom data, untuk periode harian, dan menunjukkan hasil selama dua belas "Tuan Rumah" dalam grafik yang sama? Yaitu, saya ingin menggambarkan seperti apa periode 24 jam itu, selama satu minggu untuk data yang berharga. Tujuan akhirnya adalah untuk membandingkan dua set data ini, sebelum dan sesudah pengambilan sampel.

            dates         Host CPUIOWait CPUUser CPUSys
1 2011-02-11 23:55:12     db       0      14      8
2 2011-02-11 23:55:10     app1     0       6      1
3 2011-02-11 23:55:09     app2     0       4      1

Saya sudah bisa menjalankan xyplot (CPUUser ~ date | Host) dengan efek yang baik. Namun, daripada menunjukkan setiap tanggal dalam seminggu, saya ingin sumbu X menjadi jam sehari.

Mencoba memasukkan data ini ke dalam objek xts menghasilkan kesalahan seperti "order.by memerlukan objek berbasis waktu yang tepat"

Berikut adalah str () dari bingkai data:

'data.frame':   19720 obs. of  5 variables:
$ dates    : POSIXct, format: "2011-02-11 23:55:12" "2011-02-11 23:55:10" ...
$ Host     : Factor w/ 14 levels "app1","app2",..: 9 7 5 4 3 10 6 8 2 1 ...  
$ CPUIOWait: int  0 0 0 0 0 0 0 0 0 0 ...
$ CPUUser  : int  14 6 4 4 3 10 4 3 4 4 ...
$ CPUSys   : int  8 1 1 1 1 3 1 1 1 1 ...

UPDATE: Hanya untuk referensi di masa depan, saya memutuskan untuk pergi dengan boxplot, untuk menunjukkan median, dan 'outlier'.

Pada dasarnya:

Data$hour <- as.POSIXlt(dates)$hour  # extract hour of the day
boxplot(Data$CPUUser ~ Data$hour)    # for a subset with one host or for all hosts
xyplot(Data$CPUUser ~ Data$hour | Data$Host, panel=panel.bwplot, horizontal=FALSE)

Terima kasih

Scott Hoffman
sumber
Saya kira Anda mendapatkan kesalahan itu dari xts()karena dateskolom adalah faktor.
Joshua Ulrich
Saya benar-benar baru untuk R ... Saya membuat kolom tanggal dari fungsi strptime. Data asli dari read.csv.
Scott Hoffman
1
Mari kita lihat str()dari data.frame.
Roman Luštrik
@Roman Terima kasih untuk fungsi str (), saya tidak menyadarinya. Jadi, menghilangkan kolom Factor, saya dapat menghasilkan objek xts seperti ini, x <-xts (d [, 3: 5], order.by = d [, 1]). Saya kemudian dapat menerapkan to.hourly, yang mempersingkat data dari 1.920 objek ke 480. Saya tidak yakin apakah ini akan membuat saya di tempat yang saya inginkan, tapi saya lebih dekat sekarang, saya pikir.
Scott Hoffman

Jawaban:

14

Berikut adalah salah satu pendekatan menggunakan cut () untuk membuat faktor per jam yang sesuai dan ddply () dari plyr library untuk menghitung rata-rata.

library(lattice)
library(plyr)

## Create a record and some random data for every 5 seconds 
## over two days for two hosts.
dates <- seq(as.POSIXct("2011-01-01 00:00:00", tz = "GMT"),
             as.POSIXct("2011-01-02 23:59:55", tz = "GMT"),
             by = 5)
hosts <- c(rep("host1", length(dates)), rep("host2", 
           length(dates)))
x1    <- sample(0:20, 2*length(dates), replace = TRUE)
x2    <- rpois(2*length(dates), 2)
Data  <- data.frame(dates = dates, hosts = hosts, x1 = x1, 
                    x2 = x2)

## Calculate the mean for every hour using cut() to define 
## the factors and ddply() to calculate the means. 
## getmeans() is applied for each unique combination of the
## hosts and hour factors.
getmeans  <- function(Df) c(x1 = mean(Df$x1), 
                            x2 = mean(Df$x2))
Data$hour <- cut(Data$dates, breaks = "hour")
Means <- ddply(Data, .(hosts, hour), getmeans)
Means$hour <- as.POSIXct(Means$hour, tz = "GMT")

## A plot for each host.
xyplot(x1 ~ hour | hosts, data = Means, type = "o",
       scales = list(x = list(relation = "free", rot = 90)))
Jason Morgan
sumber
Terima kasih untuk ini ... Saya pikir saya mungkin perlu menulis ulang pertanyaannya, atau bertanya yang baru. Melihat stats.stackexchange.com/questions/980/… pertanyaan ini , saya sekarang berpikir mendapatkan cara tidak persis apa yang saya cari.
Scott Hoffman
@ JVM Bisakah Anda menjelaskan bagaimana fungsi getmeans bekerja, dan mengapa Anda tidak hanya menggunakan fungsi mean atau colMeans?
Scott Hoffman
1
Fungsi ddply () memotong dataset asli menjadi himpunan bagian yang ditentukan oleh host dan jam. Kemudian melewati ini ke getmeans () sebagai data.frame. Untuk tugas Anda, menggunakan colMeans () mungkin akan berfungsi dengan baik, tetapi Anda mungkin harus terlebih dahulu menghapus kolom yang tidak Anda butuhkan. Yang menyenangkan tentang menggunakan ddply () dengan cara ini adalah Anda dapat menghitung stat arbitrer yang Anda mungkin tertarik; mis. sd (), range (), dll.
Jason Morgan
6

Agregasi juga berfungsi tanpa menggunakan zoo(dengan data acak dari 2 variabel selama 3 hari dan 4 host seperti dari JWM). Saya berasumsi bahwa Anda memiliki data dari semua host untuk setiap jam.

nHosts <- 4  # number of hosts
dates  <- seq(as.POSIXct("2011-01-01 00:00:00"),
              as.POSIXct("2011-01-03 23:59:30"), by=30)
hosts  <- factor(sample(1:nHosts, length(dates), replace=TRUE),
                 labels=paste("host", 1:nHosts, sep=""))
x1     <- sample(0:20, length(dates), replace=TRUE)  # data from 1st variable
x2     <- rpois(length(dates), 2)                    # data from 2nd variable
Data   <- data.frame(dates=dates, hosts=hosts, x1=x1, x2=x2)

Saya tidak sepenuhnya yakin apakah Anda ingin rata-rata hanya dalam setiap jam, atau dalam setiap jam sepanjang hari. Saya akan melakukan keduanya.

Data$hFac <- droplevels(cut(Data$dates, breaks="hour"))
Data$hour <- as.POSIXlt(dates)$hour  # extract hour of the day

# average both variables over days within each hour and host
# formula notation was introduced in R 2.12.0 I think
res1 <- aggregate(cbind(x1, x2) ~ hour + hosts, data=Data, FUN=mean)
# only average both variables within each hour and host
res2 <- aggregate(cbind(x1, x2) ~ hFac + hosts, data=Data, FUN=mean)

Hasilnya terlihat seperti ini:

> head(res1)
  hour hosts        x1       x2
1    0 host1  9.578431 2.049020
2    1 host1 10.200000 2.200000
3    2 host1 10.423077 2.153846
4    3 host1 10.241758 1.879121
5    4 host1  8.574713 2.011494
6    5 host1  9.670588 2.070588

> head(res2)
                 hFac hosts        x1       x2
1 2011-01-01 00:00:00 host1  9.192308 2.307692
2 2011-01-01 01:00:00 host1 10.677419 2.064516
3 2011-01-01 02:00:00 host1 11.041667 1.875000
4 2011-01-01 03:00:00 host1 10.448276 1.965517
5 2011-01-01 04:00:00 host1  8.555556 2.074074
6 2011-01-01 05:00:00 host1  8.809524 2.095238

Saya juga tidak sepenuhnya yakin tentang jenis grafik yang Anda inginkan. Berikut adalah versi sederhana dari grafik untuk variabel pertama dengan baris data terpisah untuk setiap host.

# using the data that is averaged over days as well
res1L <- split(subset(res1, select="x1"), res1$hosts)
mat1  <- do.call(cbind, res1L)
colnames(mat1) <- levels(hosts)
rownames(mat1) <- 0:23
matplot(mat1, main="x1 per hour, avg. over days", xaxt="n", type="o", pch=16, lty=1)
axis(side=1, at=seq(0, 23, by=2))
legend(x="topleft", legend=colnames(mat1), col=1:nHosts, lty=1)

Grafik yang sama untuk data yang hanya dirata-rata dalam setiap jam.

res2L <- split(subset(res2, select="x1"), res2$hosts)
mat2  <- do.call(cbind, res2L)
colnames(mat2) <- levels(hosts)
rownames(mat2) <- levels(Data$hFac)
matplot(mat2, main="x1 per hour", type="o", pch=16, lty=1)
legend(x="topleft", legend=colnames(mat2), col=1:nHosts, lty=1)
caracal
sumber
Respons yang bagus, banyak di sana yang saya tidak kenal, jadi saya perlu mencobanya. Namun, melihat data saya dengan metode Anda, saya pikir saya perlu menunjukkan poin tinggi dalam data saya juga. Terima kasih
Scott Hoffman
2

Anda dapat checkout aggregate.zoofungsi dari paket zoo: http://cran.r-project.org/web/packages/zoo/zoo.pdf

Charlie

Charlie
sumber
Bisakah Anda membantu saya memahami mengapa saya mendapatkan NAS saat menjalankan ini?
Scott Hoffman
Halo Scott, saya belum benar-benar menggunakan aggregate.zoofungsinya, meskipun saya telah menggunakan zoopaket. Apakah Anda memastikan bahwa objek Anda adalah zooobjek pertama? Dokumentasi yang saya tunjukkan akan membantu Anda di sana.
Charlie