Выбор R по значению, избегайте NA

#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"