标题可能听起来有点奇怪,但我没有找到更好的方法来定义我的问题。
下面是一个示例数据集:
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 NA,Acicarpha bonariensis,Acicarpha spathulata,Acisanthera variabilis,Acisanthera NA和Acmella NA。
情况是这样的:我想只选择相关的行Acmella NA自只sp1
列返回值为NA。其他物种也有NA,但它们没有,只有NA。我该怎么做呢?我在打我的头。
这里有一些代码,我认为你想要的。它有四个步骤:
- 按
genus
分组 - 创建一个新的列
all_sp1_na
,如果每个属的sp1
观测值都是NA
,则FALSE
为TRUE
(即,如果至少有一个sp1
观测值不是NA
,则FALSE
)。 - 过滤
all_sp1_na
为true的行。 - 删除临时列
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 withfilter
fromdplyr
library(dplyr)
test %>%
filter(!genus %in% genus[!is.na(sp1)])