일주일 동안 분 단위의 데이터를 시간 단위로 집계하는 방법은 무엇입니까?


15

매일 여러 데이터 열에 대한 시간별 평균을 구하고 동일한 그래프에 12 개의 "호스트"에 대한 결과를 어떻게 표시합니까? 즉, 24 시간 동안의 데이터가 몇 주 동안 표시되는지 그래프로 표시하고 싶습니다. 최종 목표는 샘플링 전후에이 데이터의 두 세트를 비교하는 것입니다.

            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 (CPUUser ~ 날짜 | 호스트)을 좋은 효과로 실행할 수있었습니다. 그러나 주중의 각 날짜를 표시하는 대신 X 축을 하루 중 시간으로 설정하고 싶습니다.

이 데이터를 xts 객체로 가져 오려고 하면 "order.by는 적절한 시간 기반 객체가 필요합니다" 와 같은 오류가 발생 합니다

데이터 프레임의 str ()은 다음과 같습니다.

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

업데이트 : 나중에 참조하기 위해 상자 그림을 사용하여 중간 값과 '이상 값'을 모두 표시하기로 결정했습니다.

본질적으로 :

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)

감사


열이 요인 xts()이기 때문에 이러한 오류가 발생한다고 생각합니다 dates.
Joshua Ulrich

나는 R을 처음 접했다 ... strptime 함수에서 날짜 열을 만들었습니다. 원본 데이터는 read.csv에서 가져온 것입니다.
Scott Hoffman

1
str()data.frame을 보자 .
Roman Luštrik

@Roman str () 함수를 사용해 주셔서 감사합니다. 따라서 Factor 열을 제거하면 x <-xts (d [, 3 : 5], order.by = d [, 1])와 같은 xts 객체를 생성 할 수 있습니다. 그런 다음 .hourly에 적용 할 수 있었는데, 19720 개 개체의 데이터를 480 개로 줄였습니다. 이것이 원하는 위치에 도달할지 확실하지 않지만 지금은 더 가까워지고 있습니다.
Scott Hoffman

답변:


14

다음은 cut ()을 사용하여 평균을 계산하기 위해 plyr 라이브러리에서 적절한 시간별 요소와 ddply ()를 만드는 한 가지 방법입니다.

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

고마워요 ... 질문을 다시 말하거나 새로운 질문을해야 할 수도 있습니다. 이 질문 stats.stackexchange.com/questions/980/…을 보면 , 이제 수단을 얻는 것이 내가 추구 하는 것이 아니라고 생각합니다.
Scott Hoffman

@JVM getmeans 함수의 작동 방식과 왜 mean 또는 colMeans 함수를 사용하지 않은 이유를 설명 할 수 있습니까?
Scott Hoffman

1
ddply () 함수는 원래 데이터 세트를 호스트 및 시간으로 정의 된 서브 세트로 자릅니다. 그런 다음이를 getmeans ()에 data.frame으로 전달합니다. 당신의 작업을 위해, colMeans ()를 사용하면 아마 잘 작동하지만, 필요하지 않은 열을 먼저 제거해야 할 것입니다. 이 방법으로 ddply ()를 사용하는 것에 대한 좋은 점은 관심있는 임의의 통계를 계산할 수 있다는 것입니다. 예 : sd (), range () 등
Jason Morgan

6

집계는 사용하지 않고 작동합니다 zoo(JWM에서와 같이 3 일 동안 2 개의 변수와 4 개의 호스트에서 임의의 데이터로). 매 시간마다 모든 호스트의 데이터가 있다고 가정합니다.

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)

매 시간 또는 하루 종일 모든 시간의 평균을 계산할지 확실하지 않습니다. 둘 다하겠습니다.

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)

결과는 다음과 같습니다.

> 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

또한 원하는 그래프 유형에 대해 완전히 확신하지 못합니다. 다음은 각 호스트에 대해 별도의 데이터 라인이있는 첫 번째 변수에 대한 기본 버전의 그래프입니다.

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

한 시간 내에 평균화 된 데이터에 대한 동일한 그래프.

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)

좋은 반응, 거기에 익숙하지 않은 많은 것들이 있으므로 시도해보십시오. 아직도, 당신의 방법으로 내 데이터를 볼 때, 나는 내 데이터에서 높은 점을 보여줄 필요가 있다고 생각합니다. 감사
스콧 호프만

2

aggregate.zoo패키지 에서 기능을 체크 아웃 할 수 있습니다 zoo: http://cran.r-project.org/web/packages/zoo/zoo.pdf

야경


이걸 실행할 때 왜 NA를 받고 있는지 이해할 수 있습니까?
Scott Hoffman

안녕하세요 스캇, 나는 패키지를 aggregate.zoo사용했지만 실제로 함수를 사용하지 않았습니다 zoo. 객체가 zoo객체인지 먼저 확인 했습니까 ? 내가 지적한 문서가 도움이 될 것입니다.
찰리
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.