(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。我该怎么做呢?我在打我的头。

这里有一些代码,我认为你想要的。它有四个步骤:

  1. genus分组
  2. 创建一个新的列all_sp1_na,如果每个属的sp1观测值都是NA,则FALSETRUE(即,如果至少有一个sp1观测值不是NA,则FALSE)。
  3. 过滤all_sp1_na为true的行。
  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   

如果你在找别的东西,请告诉我。

我们可以从base R中使用subset

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

Or withfilterfromdplyr

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

最新更新