gpt4 book ai didi

删除 R 中给定变量的重复日期

转载 作者:行者123 更新时间:2023-12-02 08:43:18 25 4
gpt4 key购买 nike

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

对于给定服务器的每个数据,我应该有一个数据点。我需要删除重复的日期。当我选择日期时,CPU 应该是最高的。例如,对于日期 1/2/2012,我的新行将是 1/2/2012 WebA 60

如何删除 R 中的重复日期?

我能做到:

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

从 CPU 上,我如何查看最高的?

最佳答案

使用聚合的解决方案:

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

关于删除 R 中给定变量的重复日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14613907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com