【问题标题】:How do I drop NAs where all cells have an NA in the columns I specify?如何删除所有单元格在我指定的列中都有 NA 的 NA?
【发布时间】:2022-01-11 05:05:09
【问题描述】:

我正在尝试使用NAs 删除行。 NA 需要在我指定的所有列中。例如,如果我指定TicketsGroup,那么每一行的两列中都需要有NAs 来指示要删除的行。我试着做 df %>% drop_na(Tickets, Group) 但出现错误提示 unexpected ,)。基本上,CityStateDate 中没有 NA,我想删除所有其他列中带有 NAs 的所有行。

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 值的行。

我将不胜感激。

【问题讨论】:

    标签: r na


    【解决方案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
    

    或者在dplyr中加上if_any

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

    【讨论】:

      【解决方案2】:

      使用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
      

      【讨论】:

        【解决方案3】:

        我们可以使用否定的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
        

        【讨论】:

          【解决方案4】:

          谢谢大家的cmets。有助于解决这个问题。我想我找到了解决办法。对于任何想知道的人:

          通过稍微编辑上面的代码,我找到了所有 NA 的行。然后我用我的 df 反加入它,它有所有观察结果以获得我想要的结果。

          data_NA <-
          df %>% 
          filter(is.na(Tickets) & is.na(Group))
          
          df <-
          df %>%
          anti_join(data_NA)
          
          

          【讨论】:

          • 不需要创建中间对象,然后是anti_join。我们可以只使用否定运算符 (!) 和 OR 运算符 (|) 来过滤您选择的行 OUT 而不是 IN:filter(!(is.na(Tickets) | is.na(Group)))
          猜你喜欢
          • 2018-01-04
          • 2020-07-22
          • 2022-01-12
          • 2021-10-16
          • 2022-01-16
          • 2018-10-21
          • 1970-01-01
          • 2021-12-24
          • 2019-01-06
          相关资源
          最近更新 更多