2013-03-14 27 views
5

Tôi có một dataframe trông giống như sau:tập con dataframe dựa trên số lượng ngoại

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

Tôi muốn loại bỏ bất kỳ trang web mà số lượng luôn là < 5% số lượng tối đa hàng tháng trên tất cả các trang web.

Các đếm tối đa hàng tháng trên tất cả các trang web này là:

library(plyr) 
ddply(df, .(Month), summarise, Max.Count=max(Count)) 

Nếu đếm tổng số 1 được gán cho Site5, sau đó đếm của nó luôn < 5% số lượng tối đa hàng tháng trên tất cả các trang web. Vì vậy, tôi muốn xóa site5.

df$Count[df$Site=='site5'] <- 1 

Tuy nhiên, sau khi gán giá trị mới để site2, một số đếm của nó là < 5% số lượng hàng tháng tối đa, trong khi những người khác là> 5%. Vì vậy, tôi sẽ không muốn site2 gỡ bỏ.

df$Count[df$Site=='site2'] <- ceiling(seq(1, 1000, length.out=20)) 

Làm cách nào để có thể đặt dataframe để loại bỏ bất kỳ trang web nào có số lượng luôn là < 5% số lượng tối đa hàng tháng? Hãy cho tôi biết nếu câu hỏi không rõ ràng và tôi sẽ sửa đổi.

Trả lời

3

Dưới đây là một giải pháp plyr:

## df2$test is true if Count >= max(Count)*0.05 for this month 
df2 <- ddply(df, .(Month), transform, test=Count>=(max(Count)*0.05)) 
## For each site, test$keep is true if at least one count is >= max(Count)*0.05 for this month 
test <- ddply(df2, .(Site), summarise, keep=sum(test)>0) 
## Subsetting 
sites <- test$Site[test$keep] 
df[df$Site %in% sites,] 
6

Một giải pháp 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 
+0

Vì vậy, loại bỏ tất cả các hàng cho các trang web nơi count <5% số lượng tối đa trong Jan, <5% số lượng tối đa trong tháng hai, <5% tối đa tính vào tháng Ba .... mỗi tháng trong năm. Không loại bỏ bất kỳ hàng nào cho các trang web, ví dụ: tính <5% số lượng tối đa mỗi tháng trừ tháng 6. – luciano

+0

@RossAhmed, điều này nên làm điều đó. – Arun

Các vấn đề liên quan