(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 NA、Acicarpha bonariensis , 匙叶果果, 紫花木, 紫果, 紫花.
这是交易:我试图 select 仅与 Acmella NA 相关的行,因为 仅 在 sp1
列上返回值是不适用。其他物种也有NA,但它们没有只有 NA。我怎样才能做到这一点?我在敲我的头。
这里有一些代码可以满足您的要求。它有四个步骤:
- 按
genus
. 对行进行分组
- 创建一个名为
all_sp1_na
的新列,如果每个属的所有 sp1
观测值都是 NA
,则为 TRUE
,否则为 FALSE
(即 FALSE
如果至少一个 sp1
观察结果 不是 NA
该属)。
- 筛选出
all_sp1_na
为真的行。
- 删除临时列
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)])
标题可能听起来有点奇怪,但我找不到更好地定义我的问题的方法。
这里是一个示例数据集:
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 , 匙叶果果, 紫花木, 紫果, 紫花.
这是交易:我试图 select 仅与 Acmella NA 相关的行,因为 仅 在 sp1
列上返回值是不适用。其他物种也有NA,但它们没有只有 NA。我怎样才能做到这一点?我在敲我的头。
这里有一些代码可以满足您的要求。它有四个步骤:
- 按
genus
. 对行进行分组
- 创建一个名为
all_sp1_na
的新列,如果每个属的所有sp1
观测值都是NA
,则为TRUE
,否则为FALSE
(即FALSE
如果至少一个sp1
观察结果 不是NA
该属)。 - 筛选出
all_sp1_na
为真的行。 - 删除临时列
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)])