gpt4 book ai didi

r - 基于异常计数的子集数据框

转载 作者:行者123 更新时间:2023-12-04 17:37:00 24 4
gpt4 key购买 nike

我有一个如下所示的数据框:

df <- data.frame(Site=rep(paste0('site', 1:5), 50),
Month=sample(1:12, 50, replace=T),
Count=(sample(1:1000, 50, replace=T)))

我想删除所有站点的计数始终小于最大每月计数的 5% 的任何站点。

所有站点的最大每月计数为:
library(plyr)
ddply(df, .(Month), summarise, Max.Count=max(Count))

如果分配给 site5 的计数为 1,则其计数始终小于所有站点的最大每月计数的 5%。因此,我希望删除 site5。
df$Count[df$Site=='site5'] <- 1

但是,在为 site2 分配新值后,其某些计数小于最大每月计数的 5%,而其他计数则大于 5%。因此我不想删除 site2。
df$Count[df$Site=='site2'] <- ceiling(seq(1, 1000, length.out=20))

如何对数据框进行子集化以删除计数始终小于最大每月计数的 5% 的任何站点?如果问题不清楚,请告诉我,我会修改。

最佳答案

data.table解决方案:

require(data.table)
set.seed(45)
df <- data.frame(Site=rep(paste0('site', 1:5), 50),
Month=sample(1:12, 50, replace=T),
Count=(sample(1:1000, 50, replace=T)))
df$Count[df$Site=='site5'] <- 1

dt <- data.table(df, key=c("Month", "Site"))
# set max.count per site+month
dt[, max.count := max(Count), by = list(Month)]
# get the site that is TRUE for all months it is present
d1 <- dt[, list(check = all(Count < .05 * max.count)), by = list(Month, Site)]
sites <- as.character(d1[, all(check == TRUE), by=Site][V1 == TRUE, Site])

dt.out <- dt[Site != sites][, max.count := NULL]
# Site Month Count
# 1: site1 1 939
# 2: site1 1 939
# 3: site1 1 939
# 4: site1 1 939
# 5: site1 1 939
# ---
# 196: site2 12 969
# 197: site2 12 684
# 198: site2 12 613
# 199: site2 12 969
# 200: site2 12 684

关于r - 基于异常计数的子集数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15407727/

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