Bir haftalık dakika verilerine göre saatlik yollarla nasıl toplanır?


15

Günlük grafikte birden çok veri sütunu için saatlik araçları nasıl elde edersiniz ve aynı grafikte on iki "Ana Bilgisayar" için sonuçları nasıl gösterirsiniz? Yani, 24 saatlik bir sürenin neye benzediğini, bir haftalık veri için grafik olarak göstermek istiyorum. Nihai amaç, örneklemeden önce ve sonra bu verilerin iki kümesini karşılaştırmak olacaktır.

            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

Xyplot'u (CPUUser ~ dates | Host) iyi bir etkiyle çalıştırabildim. Ancak, haftadaki her tarihi göstermek yerine, X ekseninin günün saatleri olmasını istiyorum.

Bu verileri bir xts nesnesine almaya çalışmak "order.by uygun bir zaman tabanlı nesne gerektirir" gibi hatalarla sonuçlanır.

İşte veri çerçevesinin str () yöntemi:

'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 ...

GÜNCELLEME: Sadece gelecekteki referans için, hem medyanı hem de 'aykırı değerleri' göstermek için bir kutu çizmeye gitmeye karar verdim.

esasen:

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)

Teşekkürler


Sana gelen bu hataları olsun tahmin ediyorum xts()çünkü datessütun bir etkendir.
Joshua Ulrich

R için gerçekten yeniyim ... Tarih sütununu strptime fonksiyonundan oluşturdum. Orijinal veriler read.csv dosyasından alınmıştır.
Scott Hoffman

1
str()Data.frame'i görelim .
Roman Luštrik

@Roman str () işlevi için teşekkürler, bunun farkında değildim. Böylece, Faktör sütunundan kurtulmak için böyle bir xts nesnesi oluşturabilirim, x <-xts (d [, 3: 5], order.by = d [, 1]). Daha sonra, 19720 nesnelerinden 480'e kadar olan verileri kısaltan uygulayabildim. Bunun beni istediğim yere getirip getirmeyeceğinden emin değilim, ama şimdi daha yakınım, sanırım.
Scott Hoffman

Yanıtlar:


14

Burada ortalama saatlik faktörleri oluşturmak için cut () ve araçları hesaplamak için plyr kütüphanesinden ddply () kullanılan bir yaklaşım.

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

Bunun için teşekkürler ... Sanırım soruyu tekrar gözden geçirmem veya yeni bir soru sormam gerekebilir. Bu soruya baktığımda stats.stackexchange.com/questions/980/… , şimdi araçları elde etmenin tam olarak peşimde olmadığını düşünüyorum.
Scott Hoffman

@JVM getmeans işlevinin nasıl çalıştığını ve neden yalnızca mean veya colMeans işlevlerini kullanmadığınızı açıklayabilir misiniz?
Scott Hoffman

1
Ddply () işlevi, orijinal veri kümesini ana bilgisayarlar ve saat tarafından tanımlanan alt kümelere ayırır. Daha sonra bunları data.frame olarak getmeans () yöntemine iletir. Göreviniz için colMeans () kullanmak muhtemelen iyi sonuç verir, ancak muhtemelen ilk olarak ihtiyacınız olmayan sütunları kaldırmanız gerekir. Ddply () yöntemini bu şekilde kullanmanın güzel yanı, ilginizi çekebilecek herhangi bir rasgele durumu hesaplayabilmenizdir; ör., sd (), aralık () vb.
Jason Morgan

6

Toplama da kullanılmadan çalışır zoo(3 gün boyunca 2 değişken ve rasgele veriler JWM gibi 4 ana bilgisayarla). Her saat için tüm ana bilgisayarlardan verileriniz olduğunu varsayalım.

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)

Sadece her saat içinde mi, yoksa tüm günlerde her saat içinde mi ortalamayı istediğinizden emin değilim. Ben ikisini de yapacağım.

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)

Sonuç şuna benzer:

> 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

İstediğiniz grafik türünden de tam olarak emin değilim. Her bir ana bilgisayar için ayrı veri satırlarına sahip ilk değişken için bir grafiğin çıplak kemikler sürümü.

# 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)

Yalnızca her saat içinde ortalaması alınan veriler için aynı grafik.

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)

Güzel tepki, orada aşina olmadığım bol, bu yüzden denemek gerekir. Yine de, verilerime yöntemlerinizle baktığımda, verilerimdeki yüksek noktaları da göstermem gerektiğini düşünüyorum. Teşekkürler
Scott Hoffman

2

Sen ödeme olabilir aggregate.zoopaketinden işlevi zoo: http://cran.r-project.org/web/packages/zoo/zoo.pdf

Charlie


Bunu yaparken neden NA aldığımı anlamama yardımcı olabilir misiniz?
Scott Hoffman

Merhaba Scott, paketi aggregate.zookullanmış olsam da aslında işlevi kullanmadım zoo. zooÖnce nesnenizin bir nesne olduğundan emin oldunuz mu? İşaret ettiğim belgeler size yardımcı olacaktır.
Charlie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.