प्रति सप्ताह एक मिनट के लिए मिनट के आंकड़ों को कैसे एकत्रित करें?


15

आप दैनिक अवधि के लिए कई डेटा कॉलम के लिए प्रति घंटा साधन कैसे प्राप्त करेंगे, और एक ही ग्राफ में बारह "होस्ट" के लिए परिणाम दिखा सकते हैं? यही है, मैं एक सप्ताह के डेटा के लिए 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 ~ तिथियाँ | होस्ट) को अच्छे प्रभाव के साथ चलाने में सक्षम रहा हूँ। हालांकि, सप्ताह में प्रत्येक तारीख दिखाने के बजाय, मैं दिन के घंटे होने के लिए एक्स अक्ष चाहता हूं।

इस डेटा को एक एक्सटीएस ऑब्जेक्ट में त्रुटियों के रूप में प्राप्त करने की कोशिश करना जैसे "आदेश। इसके लिए एक उपयुक्त समय-आधारित ऑब्जेक्ट की आवश्यकता होती है"

यहाँ डेटा फ़्रेम का एक 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कॉलम एक कारक है।
जोशुआ उलरिच

मैं वास्तव में आर के लिए नया हूं ... मैंने स्ट्रैप्टम फंक्शन से डेट्स कॉलम बनाया। मूल डेटा read.csv से है।
स्कॉट हॉफमैन

1
चलो str()data.frame देखते हैं ।
रोमन लुसट्रिक

@ स्ट्रोम () फ़ंक्शन के लिए धन्यवाद, मुझे इसकी जानकारी नहीं थी। तो, फैक्टर कॉलम से छुटकारा पाने के लिए, मैं इस तरह xts ऑब्जेक्ट उत्पन्न कर सकता हूं, x <-xts (d [, 3: 5], order.by = d [, 1])। मैं तब। पर लागू करने में सक्षम था, जो 19720 वस्तुओं से 480 तक डेटा को छोटा करता है। मुझे यकीन नहीं है कि यह मुझे मिलेगा जहां मैं चाहता हूं, लेकिन मैं अब करीब हूं, मुझे लगता है।
स्कॉट हॉफमैन

जवाबों:


14

साधन की गणना के लिए प्लाई लाइब्रेरी से उचित प्रति घंटा कारक और 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)))

इसके लिए धन्यवाद ... मुझे लगता है कि मुझे प्रश्न को फिर से लिखना पड़ सकता है, या एक नया पूछना चाहिए। इस सवाल को देखते हुए आंकड़े .stackexchange.com /questions/ 980 / , अब मुझे लगता है कि साधन प्राप्त करना वास्तव में मेरे बाद नहीं है।
स्कॉट हॉफमैन

@ जेवीएम क्या आप बता सकते हैं कि गेटमाइंस फ़ंक्शन कैसे काम करता है, और आपने सिर्फ मीन या कॉलमेन के कार्यों का उपयोग क्यों नहीं किया?
स्कॉट हॉफमैन

1
Ddply () फ़ंक्शन मूल डेटासेट को मेजबानों और घंटे द्वारा परिभाषित सबसेट में काट देता है। यह तब डेटा के रूप में getmeans () को पास करता है। अपने कार्य के लिए, colMeans () का उपयोग करना शायद ठीक काम करेगा, लेकिन आपको संभवतः उन कॉलमों को हटाना होगा जिनकी आपको आवश्यकता नहीं है। Ddply () का उपयोग करने के बारे में अच्छी बात यह है कि आप किसी भी मनमाने ढंग से स्टेट की गणना कर सकते हैं जिसके लिए आपकी रुचि हो सकती है; जैसे, एसडी (), रेंज (), इत्यादि
जेसन मॉर्गन

6

एकत्रीकरण भी उपयोग किए बिना काम करता है zoo(3 दिनों के लिए 2 चर से यादृच्छिक डेटा और JWM से 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 क्यों मिल रहा है?
स्कॉट हॉफमैन

हाय स्कॉट, मैंने वास्तव में aggregate.zooफ़ंक्शन का उपयोग नहीं किया है , हालांकि मैंने zooपैकेज का उपयोग किया है। क्या आपने यह सुनिश्चित किया कि आपकी zooवस्तु पहले एक वस्तु थी ? मैंने जो दस्तावेज़ीकरण इंगित किया है, आपको वहाँ मदद करनी चाहिए।
चार्ली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.