【问题标题】:How can I check if a value of a column in a dataframe in r corresponds to a single occurence of another columns for each row of the dataframe?如何检查 r 中数据框中的列的值是否对应于数据框每一行的另一列的单次出现?
【发布时间】:2019-06-01 17:24:25
【问题描述】:

我有一个像这样的数据框,其中一列中有海洋鱼类的名称,另一列中有它们各自的 BIN(这是每个物种的一种 ID)。有时单个 BIN 编号可以对应多个物种,我想检查哪些物种对应于单个 BIN,哪些物种对于每行中的每个单个物种都有多个 BIN。如果我感到困惑,我很抱歉,但我对如何做到这一点非常迷茫。 提前感谢您的任何建议

 1.  species          BIN
 2. Tilapia guineensis BOLD:AAL5979
 3. Tilapia zillii BOLD:AAB9042
 4. Fundulus rubrifrons BOLD:AAI7245
 5. Eutrigla gurnardus BOLD:AAC0262
 6.  Sprattus sprattus BOLD:AAE9187
 7.  Gadus morhua BOLD:ACF1143
 8. Clupea harengus BOLD:AAB7944
 (...)

【问题讨论】:

    标签: r


    【解决方案1】:

    使用dplyr,您可以这样做(我使用了具有两个 BIN 的物种的样本数据):

    df %>%
     group_by(species) %>%
     summarise(occurrence = n_distinct(BIN),
               BIN = paste(unique(BIN), collapse = ","))
    
      species             occurrence BIN                      
      <chr>                    <int> <chr>                    
    1 Clupea_harengus              1 BOLD:AAB7944             
    2 Eutrigla_gurnardus           2 BOLD:AAC0262,BOLD:AAE9187
    3 Fundulus_rubrifrons          1 BOLD:AAI7245             
    4 Gadus_morhua                 1 BOLD:ACF1143             
    5 Sprattus_sprattus            1 BOLD:AAE9187             
    6 Tilapia_guineensis           1 BOLD:AAL5979             
    7 Tilapia_zillii               1 BOLD:AAB9042 
    

    它计算每个“物种”的 BIN 数量,并将属于某个物种的唯一 BIN 的名称组合在一起。

    样本数据:

    df <- read.table(text = "species          BIN
     2 Tilapia_guineensis BOLD:AAL5979
     3 Tilapia_zillii BOLD:AAB9042
     4 Fundulus_rubrifrons BOLD:AAI7245
     5 Eutrigla_gurnardus BOLD:AAC0262
     6 Eutrigla_gurnardus BOLD:AAE9187
     7  Sprattus_sprattus BOLD:AAE9187
     8  Gadus_morhua BOLD:ACF1143
     9 Clupea_harengus BOLD:AAB7944", header = TRUE,
                     stringsAsFactors = FALSE)
    

    【讨论】:

      【解决方案2】:

      tidyverse 中的另一个选项是获取 distinct 行,按“物种”分组,summarise“发生”作为行数 (n()) 并使用 str_c(来自 @987654326 @ - tidyverse 包的一部分 - 当有 NA 元素时也会给出不同的行为)到 collapse 元素到单个字符串中

      library(dplyr)
      library(stringr)
      df %>% 
          distinct() %>%
          group_by(species) %>%
          summarise(occurrence = n(),
             BIN = str_c(unique(BIN), collapse = ","))
      # A tibble: 7 x 3
      #  species             occurrence BIN                      
      #  <chr>                    <int> <chr>                    
      #1 Clupea_harengus              1 BOLD:AAB7944             
      #2 Eutrigla_gurnardus           2 BOLD:AAC0262,BOLD:AAE9187
      #3 Fundulus_rubrifrons          1 BOLD:AAI7245             
      #4 Gadus_morhua                 1 BOLD:ACF1143             
      #5 Sprattus_sprattus            1 BOLD:AAE9187             
      #6 Tilapia_guineensis           1 BOLD:AAL5979             
      #7 Tilapia_zillii               1 BOLD:AAB9042 
      

      如果有 NA 元素,则行为略有不同(除非我们先处理 NAs)

      paste(c(NA, 'a', 'b'), collapse=",")
      #[1] "NA,a,b"
      str_c(c(NA, 'a', 'b'), collapse=",")
      #[1] NA
      

      数据

      df <- structure(list(species = c("Tilapia_guineensis", "Tilapia_zillii", 
      "Fundulus_rubrifrons", "Eutrigla_gurnardus", "Eutrigla_gurnardus", 
      "Sprattus_sprattus", "Gadus_morhua", "Clupea_harengus"), BIN = c("BOLD:AAL5979", 
      "BOLD:AAB9042", "BOLD:AAI7245", "BOLD:AAC0262", "BOLD:AAE9187", 
      "BOLD:AAE9187", "BOLD:ACF1143", "BOLD:AAB7944")),
      class = "data.frame", row.names = c("2", 
      "3", "4", "5", "6", "7", "8", "9"))
      

      【讨论】:

        猜你喜欢
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 2015-06-13
        • 2015-11-04
        • 1970-01-01
        • 2021-12-25
        • 2021-04-28
        • 1970-01-01
        相关资源
        最近更新 更多