【问题标题】:(R) Filter rows based on string names if the only resulting match in another column is NA(R) 如果另一列中唯一的结果匹配是 NA,则根据字符串名称过滤行
【发布时间】:2021-09-29 13:54:29
【问题描述】:

标题可能听起来有点奇怪,但我没有找到更好地定义我的问题的方法。

这里是一个示例数据集:

test = data.frame(genus = c("Acicarpha", "Acicarpha", "Acicarpha", "Acicarpha", "Acisanthera", "Acisanthera", "Acisanthera", "Acisanthera", "Acmella", "Acmella"), sp1 = c("NA", "bonariensis", "bonariensis", "spathulata", NA, "variabilis", "variabilis", "variabilis", NA, NA))

如您所见,我有几个可能的物种名称 (genus+sp1):Acicarpha NAAcicarpha bonariensisAcicarpha spathulataAcisanthera variabilisAcisanthera NAAcmella NA

这里是交易:我试图只选择与 Acmella NA 相关的行,因为 sp1 列上的 only 返回值是 NA。其他物种也有 NA,但它们没有只有 NA。我怎样才能做到这一点?我在打我的头。

【问题讨论】:

    标签: r filter match aggregate tidyverse


    【解决方案1】:

    这里有一些代码可以满足您的要求。它有四个步骤:

    1. genus对行进行分组。
    2. 如果每个属的所有sp1 观测值都是NA,则创建一个名为all_sp1_na 的新列FALSE,否则(即FALSE,如果至少一个sp1 观测值是不是NA那个属)。
    3. 过滤all_sp1_na 为真的行。
    4. 删除临时列all_sp1_na
    library(tidyverse)
    
    test %>%
      group_by(genus) %>%
      mutate(all_sp1_na = all(is.na(sp1))) %>%
      filter(all_sp1_na) %>%
      select(-all_sp1_na)
    

    它给出了这个结果:

    # A tibble: 2 x 2
    # Groups:   genus [1]
      genus   sp1  
      <chr>   <chr>
    1 Acmella NA   
    2 Acmella NA   
    

    如果您正在寻找其他东西,请告诉我。

    【讨论】:

      【解决方案2】:

      我们可以使用base R中的subset

      subset(test, !genus %in% genus[!is.na(sp1)])
           genus  sp1
      9  Acmella <NA>
      10 Acmella <NA>
      

      或者使用filter 来自dplyr

      library(dplyr)
      test %>%
          filter(!genus %in% genus[!is.na(sp1)])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-08
        • 2021-07-11
        • 1970-01-01
        • 1970-01-01
        • 2021-10-22
        • 1970-01-01
        相关资源
        最近更新 更多