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