2013-03-14 6 views
5

나는 다음과 같이 보입니다 dataframe 있습니다부분 집합 dataframe

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 %가 항상 할 사이트를 제거하려는합니다. 모든 사이트에서

최대 월 수는 있습니다

1의 카운트가 site5에 할당 된 경우
library(plyr) 
ddply(df, .(Month), summarise, Max.Count=max(Count)) 

, 다음의 수는 항상 모든 사이트에서 최대 월간 카운트 < 5 %이다. 따라서 사이트 5를 제거해야합니다. 다른 사람들이> 5 % 동안

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

그러나 사이트 2에 새로운 값을 할당 한 후, 그 계산의 일부, 최대 월간 카운트 < 5 %이다. 따라서 site2를 제거하지 않으려 고합니다.

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

어떻게 카운트 항상 최대 월간 카운트 < 5 %있는 모든 사이트를 제거 dataframe 서브 세트를 할 수 있습니까? 질문이 불분명 한 경우 알려 주시면 수정 해 드리겠습니다.

답변

3

가 여기에 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

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

그래서 사이트에 대한 모든 행을 제거 할 경우 1 월 수를 <5 %의 최대 수, <2 월 5 %의 최대 수, 3 월에 5 % 이하의 최대 수가 계산됩니다. 예를 들어, 6 월을 제외하고 매월 최대 카운트가 5 % 미만인 사이트의 행을 제거하지 마십시오. – luciano

+0

@RossAhmed,이 작업을 수행해야합니다. – Arun