首页 > 解决方案 > (R) 如果另一列中唯一的结果匹配是 NA,则根据字符串名称过滤行

问题描述

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

这是一个示例数据集:

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是 NA。其他物种也有 NA,但它们不仅有NA。我怎样才能做到这一点?我在敲我的头。

标签: rfiltermatchaggregatetidyverse

解决方案


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

  1. 按 对行进行分组genus
  2. 如果每个属的所有观测值都是,则创建一个新列,否则(即all_sp1_na,如果至少一个观测值属于该属)。TRUEsp1NAFALSEFALSEsp1 NA
  3. 筛选为all_sp1_natrue 的行。
  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   

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


推荐阅读