【问题标题】:subset dataframe based on outlying counts基于异常计数的子集数据帧
【发布时间】:2013-03-14 11:17:41
【问题描述】:

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

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

如果将计数 1 分配给站点 5,则其计数始终小于所有站点每月最大计数的 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% 的任何网站?如果问题不清楚,请告诉我,我会修改。

【问题讨论】:

    标签: r subset


    【解决方案1】:

    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
    

    【讨论】:

    • 因此,删除所有网站的所有行,这些网站的计数在 1 月的最大计数
    • @RossAhmed,应该这样做。
    【解决方案2】:

    这是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,]
    

    【讨论】:

      猜你喜欢
      • 2018-07-08
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 2018-09-05
      • 2018-06-07
      • 1970-01-01
      相关资源
      最近更新 更多