কীভাবে এক সপ্তাহের জন্য মিনিট উপাত্তকে ঘণ্টায়িক উপায়ে একত্রিত করবেন?


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

আমি এক্সপ্লট (সিপিইউউজার - তারিখ | হোস্ট) ভাল প্রভাব সহ চালাতে সক্ষম হয়েছি। যাইহোক, সপ্তাহে প্রতিটি তারিখ প্রদর্শন করার পরিবর্তে, আমি এক্স অক্ষটি দিনের সময় হ'ল চাই।

"অর্ডার.বাইয়ের জন্য উপযুক্ত সময় ভিত্তিক অবজেক্টের প্রয়োজন হয় " এর মতো ত্রুটির ফলে এই ডেটা এক্সটিএস অবজেক্টে আনার চেষ্টা করা হচ্ছে

এখানে ডেটা ফ্রেমের একটি স্ট্রিং () দেওয়া হয়েছে:

'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()ডেটা.ফ্রেমটি দেখি ।
রোমান Luštrik

@ রোমান ধন্যবাদ টিআর () ফাংশনের জন্য, আমি এটি সম্পর্কে অবগত ছিলাম না। সুতরাং, ফ্যাক্টর কলামটি থেকে মুক্তি পেয়ে, আমি এই জাতীয় xts অবজেক্ট তৈরি করতে পারি, x <-xts (d [, 3: 5], অর্ডার.বি = ডি [, 1])। তারপরে আমি hourly এ আবেদন করতে সক্ষম হয়েছি, যা 19720 অবজেক্টের ডেটা সংক্ষিপ্ত করে 480-এ নামিয়ে আনে I'm আমি নিশ্চিত নই যে এটি আমার যেখানে চাইবে সেখানে পাবে, তবে আমি এখন কাছে এসেছি, আমি মনে করি।
স্কট হফম্যান

উত্তর:


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

এর জন্য ধন্যবাদ ... আমি মনে করি যদিও আমার এই প্রশ্নটির পুনরায় উচ্চারণ করতে হবে বা একটি নতুন জিজ্ঞাসা করতে হবে। এই প্রশ্নটি stats.stackexchange.com/questions/980/… দেখে , আমি এখন মনে করি যে উপায়গুলি অর্জন করা ঠিক আমার পরে যা হচ্ছে তা নয়।
স্কট হফম্যান

@ জেভিএম আপনি কীভাবে গেটমিনস ফাংশনটি কাজ করে তা ব্যাখ্যা করতে পারেন এবং আপনি কেন কেবল গড় বা কলমিয়ান ফাংশন ব্যবহার করেননি?
স্কট হফম্যান

1
Ddply () ফাংশনটি মূল ডেটাसेटকে হোস্ট এবং ঘন্টা দ্বারা সংজ্ঞায়িত সাবসেটগুলিতে কাটা দেয়। এরপরে এটি ডেটা.ফ্রেম হিসাবে getmeans () এ পাস করে। আপনার কাজের জন্য, কলমিনস () ব্যবহার করা সম্ভবত ঠিক কাজ করবে তবে আপনার প্রথমে আপনার প্রয়োজনীয় কলামগুলি সরিয়ে ফেলতে হবে। এইভাবে ডিডিপ্লাই () ব্যবহার করার ক্ষেত্রে দুর্দান্ত জিনিসটি হ'ল আপনি যে কোনও স্বেচ্ছাসেবীর স্ট্যাটাসটি করতে আগ্রহী হতে পারেন তা গণনা করতে পারেন; উদাঃ, এসডি (), ব্যাপ্তি () ইত্যাদি
জেসন মরগান

6

সমষ্টিটি ব্যবহার না করেও কাজ করে zoo(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

রাতের পাহারাদার


আপনি কি আমাকে বুঝতে সাহায্য করতে পারেন যে এই চালানোর সময় আমি কেন এনএ পাচ্ছি?
স্কট হফম্যান

হাই স্কট, আমি প্যাকেজটি aggregate.zooব্যবহার করেছি, যদিও আমি আসলে ফাংশনটি ব্যবহার করি নি zoo। আপনি কি নিশ্চিত করেছেন যে আপনার বস্তুটি প্রথমে একটি zooবস্তু ছিল ? আমি যে ডকুমেন্টেশনটির দিকে ইঙ্গিত করেছি তাতে আপনাকে সেখানে সহায়তা করা উচিত।
চার্লি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.