【问题标题】:Count number of NA's in a Row in Specified Columns R [duplicate]计算指定列R中一行中的NA数[重复]
【发布时间】:2022-01-05 06:40:16
【问题描述】:

我希望能够计算指定列中一行中出现的 NA 的数量。从下面的数据中,我希望能够按行计算出现在 first、last、address、phone 和 state 列中的 NA(不包括计数中的 m_initial 和 customer)。

    first   m_initial     last         address            phone      state  customer 
    Bob         L         Turner       123 Turner Lane    410-3141   Iowa   NA        
    Will        P         Williams     456 Williams Rd    491-2359   NA     Y        
    Amanda      C         Jones        789 Haggerty       NA         NA     Y        
    Lisa        NA        Evans        NA                 NA         NA     N        

期望的输出:

    first   m_initial   last       address            phone      state  customer na_count 
    Bob     L           Turner     123 Turner Lane    410-3141   Iowa   NA       0 
    Will    P           Williams   456 Williams Rd    491-2359   NA     Y        1
    Amanda  C           Jones      789 Haggerty       NA         NA     Y        2
    Lisa    NA          Evans      NA                 NA         NA     N        3  

【问题讨论】:

    标签: r dplyr data-cleaning


    【解决方案1】:
    df$na_count <- rowSums(is.na(df[c('first', 'last', 'address', 'phone', 'state')])) 
    
    df
       first m_initial     last         address    phone state customer na_count
    1    Bob         L   Turner 123 Turner Lane 410-3141  Iowa     <NA>        0
    2   Will         P Williams 456 Williams Rd 491-2359  <NA>        Y        1
    3 Amanda         C    Jones    789 Haggerty     <NA>  <NA>        Y        2
    4   Lisa      <NA>    Evans            <NA>     <NA>  <NA>        N        3
    

    【讨论】:

      【解决方案2】:

      基础 R:

      类似于 Onyambu 解决方案,不使用 rowSums 而是使用 apply 并在使用 df[,c(1,3:6] 进行子集化后应用 sum(is.na(x)

      df$na_count <- apply(df[,c(1,3:6)], 1, function(x) sum(is.na(x)))
      

      dplyr

      library(dplyr)
      df %>%  
        mutate(na_count = rowSums(is.na(select(., -c(m_initial, customer)))))
      

      输出:

         first m_initial     last         address    phone state customer na_count
      1    Bob         L   Turner 123 Turner Lane 410-3141  Iowa     <NA>        0
      2   Will         P Williams 456 Williams Rd 491-2359  <NA>        Y        1
      3 Amanda         C    Jones    789 Haggerty     <NA>  <NA>        Y        2
      4   Lisa      <NA>    Evans            <NA>     <NA>  <NA>        N        3
      

      【讨论】:

        【解决方案3】:
        library(tidyverse)
        
        df %>%
          rowwise() %>%
          mutate(na_count = sum(is.na(c_across(all_of(c("first", "last", "address", "phone", "state"))))))
        #> # A tibble: 4 × 8
        #> # Rowwise: 
        #>   first  m_initial last     address         phone    state customer na_count
        #>   <chr>  <chr>     <chr>    <chr>           <chr>    <chr> <chr>       <int>
        #> 1 Bob    L         Turner   123 Turner Lane 410-3141 Iowa  <NA>            0
        #> 2 Will   P         Williams 456 Williams Rd 491-2359 <NA>  Y               1
        #> 3 Amanda C         Jones    789 Haggerty    <NA>     <NA>  Y               2
        #> 4 Lisa   <NA>      Evans    <NA>            <NA>     <NA>  N               3
        

        reprex package (v2.0.1) 于 2022-01-04 创建

        数据:

        structure(list(first = c("Bob", "Will", "Amanda", "Lisa"), m_initial = c("L", 
        "P", "C", NA), last = c("Turner", "Williams", "Jones", "Evans"
        ), address = c("123 Turner Lane", "456 Williams Rd", "789 Haggerty", 
        NA), phone = c("410-3141", "491-2359", NA, NA), state = c("Iowa", 
        NA, NA, NA), customer = c(NA, "Y", "Y", "N")), row.names = c(NA, 
        -4L), class = c("tbl_df", "tbl", "data.frame"))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-10-14
          • 2016-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-01
          相关资源
          最近更新 更多