【问题标题】:keep columns within rows that are equal to or greater than a given value将列保留在等于或大于给定值的行中
【发布时间】:2014-10-02 19:24:00
【问题描述】:

不知道该如何表达,因为我知道的所有 R 编码都会根据总和值删除整行,但这是我想要做的一个示例。

我想从各个站点获取分类信息,但只保留在整个样本中至少出现 3 次的级别。

例如在下表中,尽管在 River mile 15 处双翅目被识别为存在一次 - 双翅目在样本中总体出现 38 次,因此我想保留该行。 Chaetocladius 属相同,虽然它在 RM0.7 中出现一次,但在样本中出现了 5 次,所以我会保留它。

此外,对于一个级别出现足够多次以保留右侧的情况,这些情况很少见,需要删除并替换为 NA。例如,在 RM15 与 Order Blattoidea 或 RM80 的情况下,Chironomus atroviridis 物种仅存在一次,但 Insecta 和 Chironomus 存在足够的时间以保持,因此我想保持这些水平,但用 NA 替换其余的水平。

RM  phylum      class   order   family          genus           species             Sum
0.5 Arthropoda  Insecta Diptera Chironomidae    Chaetocladius   Chaetocladius mel   1
15  Arthropoda  Insecta Diptera NA              NA              NA  1
15  Arthropoda  Insecta Blattoidea   NA         NA              NA  1
0.7 Arthropoda  Insecta Diptera Chironomidae    Chaetocladius   NA  1
54  Arthropoda  Insecta Diptera Chironomidae    Chaetocladius   NA  2
35  Arthropoda  Insecta Diptera Chironomidae    Chaetocladius   NA  2
80  Arthropoda  Insecta Diptera Chironomidae    Chironomus  Chironomus atroviridis  2
80  Arthropoda  Insecta Diptera Chironomidae    Chironomus  Chironomus bifurcatus   1
0.5 Arthropoda  Insecta Diptera Chironomidae    Chironomus  Chironomus bifurcatus   29

新的输出看起来像这样 -

RM  phylum  class   order   family  genus   species Sum
0.5 Arthropoda  Insecta Diptera Chironomidae    Chaetocladius   NA  1
15  Arthropoda  Insecta Diptera NA              NA              NA  1
15  Arthropoda  Insecta NA      NA              NA              NA  1
0.7 Arthropoda  Insecta Diptera Chironomidae    Chaetocladius   NA  1
54  Arthropoda  Insecta Diptera Chironomidae    Chaetocladius   NA  2
35  Arthropoda  Insecta Diptera Chironomidae    Chaetocladius   NA  2
80  Arthropoda  Insecta Diptera Chironomidae    Chironomus      NA  2
80  Arthropoda  Insecta Diptera Chironomidae    Chironomus  Chironomus bifurcatus   1
0.5 Arthropoda  Insecta Diptera Chironomidae    Chironomus  Chironomus bifurcatus   29

我已经汇总了值为 3 或更大的这些分类群的每个级别的列表,我想也许我可以通过每个级别(从门到物种)工作,但不知道如何去做。

请帮忙。

【问题讨论】:

    标签: r sorting unique rows


    【解决方案1】:

    可能有一种更简单的方法可以做到这一点,但这会提供您想要的输出。它包含在一个函数clean_data 中,您可以在其中指定某些东西必须存在多少次才能保留。在这种情况下,那些在提供的数据中出现次数不超过两次的将被替换为 NA。这符合您的需求吗?

    dat <- read.table(header=T, text='
    RM  phylum      class   order   family          genus           species             Sum
    0.5 Arthropoda  Insecta Diptera Chironomidae    Chaetocladius   "Chaetocladius mel"   1
                      15  Arthropoda  Insecta Diptera NA              NA              NA  1
                      15  Arthropoda  Insecta Blattoidea   NA         NA              NA  1
                      0.7 Arthropoda  Insecta Diptera Chironomidae    Chaetocladius   NA  1
                      54  Arthropoda  Insecta Diptera Chironomidae    Chaetocladius   NA  2
                      35  Arthropoda  Insecta Diptera Chironomidae    Chaetocladius   NA  2
                      80  Arthropoda  Insecta Diptera Chironomidae    Chironomus  "Chironomus atroviridis"  2
                      80  Arthropoda  Insecta Diptera Chironomidae    Chironomus  "Chironomus bifurcatus"   1
                      0.5 Arthropoda  Insecta Diptera Chironomidae    Chironomus  "Chironomus bifurcatus"   29
                      ')
    
    clean_data <- function(dat, repeats){
      # get the counts of each level within each column
      counts <- sapply(dat[,colnames(dat) != c("RM", "Sum")], table)
    
      # convert data to matrix for indexing
      dat <- as.matrix(dat)
    
      indices <- unlist(
        # get indices of where the elements are in data matrix
        lapply(
          # remove list elements that are character(0)
          Filter(length,
                      # find which levels are only present 'repeats' times
                      lapply(counts,FUN = function(x) names(which(x < repeats)))),
          FUN = function(y) which(dat %in% y)))
    
      # set indices to NA
      dat[indices] <- NA
      return(as.data.frame(dat))
    }
    
    clean_data(dat, 2)
    
    > clean_data(dat, 2)
        RM     phylum   class   order       family         genus               species Sum
    1  0.5 Arthropoda Insecta Diptera Chironomidae Chaetocladius                  <NA>   1
    2 15.0 Arthropoda Insecta Diptera         <NA>          <NA>                  <NA>   1
    3 15.0 Arthropoda Insecta    <NA>         <NA>          <NA>                  <NA>   1
    4  0.7 Arthropoda Insecta Diptera Chironomidae Chaetocladius                  <NA>   1
    5 54.0 Arthropoda Insecta Diptera Chironomidae Chaetocladius                  <NA>   2
    6 35.0 Arthropoda Insecta Diptera Chironomidae Chaetocladius                  <NA>   2
    7 80.0 Arthropoda Insecta Diptera Chironomidae    Chironomus                  <NA>   2
    8 80.0 Arthropoda Insecta Diptera Chironomidae    Chironomus Chironomus bifurcatus   1
    9  0.5 Arthropoda Insecta Diptera Chironomidae    Chironomus Chironomus bifurcatus  29
    

    【讨论】:

    • 感谢您的帮助。这行得通,我同意一定有更简单的方法,但我还没有找到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2021-03-13
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    相关资源
    最近更新 更多