在我指定的列中所有单元格都有 NA 的情况下,如何删除 NA?
How do I drop NAs where all cells have an NA in the columns I specify?
我正在尝试删除 NA
行。 NA 需要在我指定的所有列中。例如,如果我指定 Tickets
、Group
,则每一行的两列中都需要有 NA
,以指示删除该行。我试着做
df %>% drop_na(Tickets, Group)
但出现 unexpected ,
和 )
错误。基本上,City
、State
或 Date
中没有 NA,我想删除所有其他列中带有 NA
的所有行。
City
State
Date
Tickets
Group
Chicago
IL
2021-01-01
NA
NA
Chicago
IL
2021-02-01
NA
NA
Chicago
IL
2021-03-01
4
NA
Chicago
IL
2021-03-01
3
1
这就是我想要的:
City
State
Date
Tickets
Group
Chicago
IL
2021-03-01
4
NA
Chicago
IL
2021-03-01
3
1
TLDR:我正在尝试删除所有指定列中具有 NA
值的行。
非常感谢您的帮助。
使用filter
.
library(dplyr)
df %>% 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
使用base R
subset(df1, rowSums(is.na(df1[c("Tickets", "Group")])) < 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 %>%
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 <- 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))
谢谢大家的评论。有助于解决这个问题。我想我找到了解决办法。对于任何想知道的人:
我通过稍微编辑上面的海报代码找到了所有 NA 的行。然后我用我的 df 反加入它,它具有所有观察结果以获得我想要的结果。
data_NA <-
df %>%
filter(is.na(Tickets) & is.na(Group))
df <-
df %>%
anti_join(data_NA)
我们可以使用取反 if_all
:
library(dplyr)
df %>%
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
我正在尝试删除 NA
行。 NA 需要在我指定的所有列中。例如,如果我指定 Tickets
、Group
,则每一行的两列中都需要有 NA
,以指示删除该行。我试着做
df %>% drop_na(Tickets, Group)
但出现 unexpected ,
和 )
错误。基本上,City
、State
或 Date
中没有 NA,我想删除所有其他列中带有 NA
的所有行。
City | State | Date | Tickets | Group |
---|---|---|---|---|
Chicago | IL | 2021-01-01 | NA | NA |
Chicago | IL | 2021-02-01 | NA | NA |
Chicago | IL | 2021-03-01 | 4 | NA |
Chicago | IL | 2021-03-01 | 3 | 1 |
这就是我想要的:
City | State | Date | Tickets | Group |
---|---|---|---|---|
Chicago | IL | 2021-03-01 | 4 | NA |
Chicago | IL | 2021-03-01 | 3 | 1 |
TLDR:我正在尝试删除所有指定列中具有 NA
值的行。
非常感谢您的帮助。
使用filter
.
library(dplyr)
df %>% 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
使用base R
subset(df1, rowSums(is.na(df1[c("Tickets", "Group")])) < 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 %>%
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 <- 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))
谢谢大家的评论。有助于解决这个问题。我想我找到了解决办法。对于任何想知道的人:
我通过稍微编辑上面的海报代码找到了所有 NA 的行。然后我用我的 df 反加入它,它具有所有观察结果以获得我想要的结果。
data_NA <-
df %>%
filter(is.na(Tickets) & is.na(Group))
df <-
df %>%
anti_join(data_NA)
我们可以使用取反 if_all
:
library(dplyr)
df %>%
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