Как мне удалить NAs, где все ячейки имеют NA в указанных мной столбцах?

#r #na

#r #na

Вопрос:

Я пытаюсь отбросить строки с NA s. NAs должен быть во всех указанных мной столбцах. Например, если я укажу Tickets , Group то в NA обоих столбцах для каждой строки должно быть s, чтобы указать, какая строка должна быть удалена. Я попытался это сделать df %gt;% drop_na(Tickets, Group) , но получил ошибку, сказав unexpected , и ) . В принципе, в City , State , или нет NAs Date , и я хочу удалить все строки с NA s во ВСЕХ остальных столбцах.

Город Государство Дата Билеты Группа
Чикаго IL 2021-01-01 NA NA
Чикаго IL 2021-02-01 NA NA
Чикаго IL 2021-03-01 4 NA
Чикаго IL 2021-03-01 3 1

Это то, чего я хочу:

Город Государство Дата Билеты Группа
Чикаго IL 2021-03-01 4 NA
Чикаго IL 2021-03-01 3 1

TLDR: Я пытаюсь удалить строки, которые имеют NA значение во всех указанных столбцах.

Я был бы признателен за помощь в этом.

Ответ №1:

С помощью base R

 subset(df1, rowSums(is.na(df1[c("Tickets", "Group")])) lt; 2)  City State Date Tickets Group 3 Chicago IL 2021-03-01 4 NA 4 Chicago IL 2021-03-01 3 1  

Или с if_any помощью dplyr

 library(dplyr) df1 %gt;%   filter(if_any(c(Tickets, Group), complete.cases))  City State Date Tickets Group 1 Chicago IL 2021-03-01 4 NA 2 Chicago IL 2021-03-01 3 1  

данные

 df1 lt;- structure(list(City = c("Chicago", "Chicago", "Chicago", "Chicago" ), State = c("IL", "IL", "IL", "IL"), Date = c("2021-01-01",  "2021-02-01", "2021-03-01", "2021-03-01"), Tickets = c(NA, NA,  4L, 3L), Group = c(NA, NA, NA, 1L)), class = "data.frame",  row.names = c(NA,  -4L))  

Ответ №2:

Воспользуйся filter .

 library(dplyr)  df %gt;% filter(!is.na(Tickets) | !is.na(Group)) # City State Date Tickets Group #1 Chicago IL 2021-03-01 4 NA #2 Chicago IL 2021-03-01 3 1  

Ответ №3:

Мы могли бы использовать отрицание if_all :

 library(dplyr) df %gt;%  filter(!if_all(c(Tickets, Group), is.na))  
 City State Date Tickets Group 1 Chicago IL 2021-03-01 4 NA 2 Chicago IL 2021-03-01 3 1  

Ответ №4:

Спасибо всем за ваши комментарии. Полезно решить эту проблему. Я думаю, что нашел решение. Для всех, кто интересуется:

Я нашел строки со всеми NAs, слегка отредактировав код плаката выше. Затем я присоединился к нему со своим df, у которого есть все наблюдения, чтобы получить желаемый результат.

 data_NA lt;- df %gt;%  filter(is.na(Tickets) amp; is.na(Group))  df lt;- df %gt;% anti_join(data_NA)   

Комментарии:

1. Нет необходимости в создании промежуточного объекта, за которым следует антисоединение. Мы можем просто использовать оператор отрицания ( ! ) и оператор ИЛИ ( | ) для фильтрации выбранных строк вместо В: filter(!(is.na(Tickets) | is.na(Group)))