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

(R) Filter rows based on string names if the only resulting match in another column is 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 bonariensis , 匙叶果果, 紫花木, 紫果, 紫花.

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

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

  1. genus.
  2. 对行进行分组
  3. 创建一个名为 all_sp1_na 的新列,如果每个属的所有 sp1 观测值都是 NA,则为 TRUE,否则为 FALSE(即 FALSE 如果至少一个 sp1 观察结果 不是 NA 该属)。
  4. 筛选出 all_sp1_na 为真的行。
  5. 删除临时列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   

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

我们可以使用 subset 来自 base R

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)])