を使用したソリューション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