#r #dataframe #subset #na
Вопрос:
Я пытаюсь извлечь строки по значениям.
col1 <- c("A", "B", "C", NA)
df <- data.frame(col1)
df$col1[col1 == "A"]
Результатом в консоли является
> df$col1[col1 == "A"]
[1] "A" NA
Но, конечно, я хочу только «А». Как избежать того, чтобы R выбирал значения NA? Кстати, я думаю, что такое поведение довольно опасно, так как многие могут попасть в эту ловушку, например, замена значений, подмножество и т. Д.
Ответ №1:
filter
from dplyr
автоматически удаляет NA
элементы, даже если оператор отношения ==
library(dplyr)
df %>%
filter(col1 == 'A') %>%
pull(col1)
#[1] "A"
Или используя sbt
(для подстановки) из collapse
library(collapse)
sbt(df, col1 == 'A')$col1
#[1] "A"
Комментарии:
1. Интересно отметить, что для
collapse
представленного кода использование%>%
дало бы ошибку:df %>% sbt(col1 == "A")$col1
которая заканчивается ошибкой:Error in .$sbt(col1 == "A") : 3 arguments passed to '$' which requires 2
Ответ №2:
Используйте %in%
, который возвращает FALSE
NA
значения.
df$col1[col1 %in% "A"]
#[1] "A"
Ответ №3:
Как отметил Маркус в комментариях, базовым решением является:
df$col1[which(df$col1 == "A")]
Или с stringr
:
str_subset(df$col1, "A")
Ответ №4:
Вы могли бы использовать is.element
:
df[is.element(col1,"A"),]
#[1] "A"
Или просто отфильтровать NA
:
df[col1 == "A" amp; !is.na(col1),]
#[1] "A"