2
Date    Server  CPU
1/1/2012    WebA    30
1/1/2012    WebA    25
1/1/2012    WEbB    30
1/2/2012    WebA    45
1/2/2012    WebA    50
1/2/2012    WebA    60

dput(x)
structure(list(Date = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("1/1/2012", 
"1/2/2012"), class = "factor"), Server = structure(c(1L, 1L, 
2L, 1L, 1L, 1L), .Label = c("WebA", "WEbB"), class = "factor"), 
    CPU = c(30L, 25L, 30L, 45L, 50L, 60L)), .Names = c("Date", 
"Server", "CPU"), class = "data.frame", row.names = c(NA, -6L
))

特定のサーバーのデータごとに 1 つのデータ ポイントが必要です。重複した日付を削除する必要があります。日付を選択すると、CPU が最高になるはずです。たとえば、2012 年 1 月 2 日の日付の場合、新しい行は になります1/2/2012 WebA 60

Rで重複した日付を削除するにはどうすればよいですか?

私がすることができます:

x[!duplicated(x[1:2]),]

CPUから、最高を確認するにはどうすればよいですか?

4

2 に答える 2

4

を使用したソリューションaggregate:

aggregate(df$CPU, by=list(df$Date, df$Server), max)

#    Group.1 Group.2  x
# 1 1/1/2012    WebA 30
# 2 1/2/2012    WebA 60
# 3 1/1/2012    WEbB 30

使用するdata.table

require(data.table)
dt <- data.table(df)
setkey(dt, "Date", "Server")
dt[, list(CPU.max = max(CPU)), by="Date,Server"]

#        Date Server CPU.max
# 1: 1/1/2012   WebA      30
# 2: 1/1/2012   WEbB      30
# 3: 1/2/2012   WebA      60

編集:さらに列を求めるOPのコメントに続いて:

df <- structure(list(Date = structure(c(1L, 1L, 1L, 2L, 2L, 2L), 
               .Label = c("1/1/2012", "1/2/2012"), class = "factor"), 
               Server = structure(c(1L, 1L, 2L, 1L, 1L, 1L), 
               .Label = c("WebA", "WEbB"), class = "factor"), 
               CPU = c(30L, 25L, 30L, 45L, 50L, 60L), 
               val1 = c(5L, 2L, 6L, 3L, 1L, 4L), 
               val2 = c(5L, 3L, 6L, 4L, 1L, 2L), 
               val3 = c(1L, 2L, 4L, 3L, 6L, 5L)), 
               .Names = c("Date", "Server", "CPU", "val1", "val2", "val3"), 
               row.names = c(NA, -6L), class = "data.frame")

> df

#       Date Server CPU val1 val2 val3
# 1 1/1/2012   WebA  30    5    5    1
# 2 1/1/2012   WebA  25    2    3    2
# 3 1/1/2012   WEbB  30    6    6    4
# 4 1/2/2012   WebA  45    3    4    3
# 5 1/2/2012   WebA  50    1    1    6
# 6 1/2/2012   WebA  60    4    2    5

使用するソリューションaggregate: 一般に、式で集計を使用する方が優れています (以下に示すように)。1) 列名が保持される、2) クリーンで理解しやすい、3) 他の列を復元するためのマージが容易になる ((1 のため) )) (そして、これがあなたの質問です。私が正しければ)。

df.agg <- aggregate(data = df, CPU ~ Date + Server, max)
merge(df.agg, df)

#       Date Server CPU val1 val2 val3
# 1 1/1/2012   WebA  30    5    5    1
# 2 1/1/2012   WEbB  30    6    6    4
# 3 1/2/2012   WebA  60    4    2    5

を使用したソリューションdata.table:

dt <- data.table(df, key=c("Date", "Server"))
# .SD holds the data.frame of the current group that is processed
dt[, .SD[which.max(CPU)], by=c("Date", "Server")]

#        Date Server CPU val1 val2 val3
# 1: 1/1/2012   WebA  30    5    5    1
# 2: 1/1/2012   WEbB  30    6    6    4
# 3: 1/2/2012   WebA  60    4    2    5
于 2013-01-30T21:35:16.237 に答える
2

そして、楽しみのために、別のものplyr

library(plyr)
ddply(x, c("Date", "Server"), summarize, cpumax=max(CPU))
于 2013-01-30T21:45:32.507 に答える