【问题标题】:Conditionally remove certain rows in R有条件地删除 R 中的某些行
【发布时间】:2020-08-11 03:02:06
【问题描述】:

我有一个非常大的数据框,其中一列是捕获的鱼类。这是一个非常简短的示例:

ID = seq(1,50,1)

fishes = c("bass", "jack", "snapper")
common = sample(fishes, size = 50, replace = TRUE)

dat = as.data.frame(cbind(ID, common))

我想删除构成数据比例低于特定百分比的任何物种。对于此处的示例,假设我想删除构成数据不到 30% 的所有物种:

library(dplyr)
nrow(filter(dat, common == "bass"))      #22 rows -> 22/50 -> 44%
nrow(filter(dat, common == "jack"))      #12 rows -> 12/50 -> 24%
nrow(filter(dat, common == "snapper"))   #16 rows -> 16/50 -> 32%

在这里,千斤顶占不到 30% 的行,所以我想删除所有带有千斤顶的行(或所有少于 15 行的物种)。这在这里很容易做到,但实际上我的数据框中有 700 多种鱼类,我想剔除占数据不到 1% 的所有物种(在我的情况下少于 18,003 行) .有没有一种简化的方法来做到这一点,而不必单独过滤掉每个物种?

我想可能是某种循环,如果 common name = "x" 的行数小于 18003,则删除这些行...

【问题讨论】:

    标签: r if-statement filter


    【解决方案1】:

    您也可以在一个管道中执行此操作:

    library(dplyr)
    
    dat %>%
      mutate(percentage = n()) %>%
      group_by(common) %>%
      mutate(percentage = n() / percentage) %>%
      filter(percentage > 0.3) %>%
      select(-percentage)
    

    【讨论】:

      【解决方案2】:

      解决此问题的一种方法是首先创建一个汇总表,然后根据汇总统计信息进行过滤。可能有更直接的方法可以完成同样的事情。

      library(dplyr)
      set.seed(914) # so you get the same results from sample()
      
      ID = seq(1,50,1)
      
      fishes = c("bass", "jack", "snapper")
      common = sample(fishes, size = 50, replace = TRUE)
      
      dat = as.data.frame(cbind(ID, common))  # same as your structure, but I ended up with different species mix
      
      summ.table <-  dat %>%
            group_by(common) %>%
            summarize(number = n()) %>%
            mutate(pct= number/sum(number))
      summ.table
      # # A tibble: 3 x 3
      # common  number   pct
      # <fct>    <int> <dbl>
      # 1 bass        18  0.36
      # 2 jack        18  0.36
      # 3 snapper     14  0.28
      
      include <- summ.table$common[summ.table$pct > .3]
      
      dat.selected = filter(dat, common %in% include)
      
      

      【讨论】:

        猜你喜欢
        • 2015-08-31
        • 2021-06-09
        • 1970-01-01
        • 2022-12-17
        • 2014-05-04
        • 2012-06-05
        • 2021-11-25
        • 1970-01-01
        • 2021-02-04
        相关资源
        最近更新 更多