【问题标题】:R: how to total the number of NA in each col of data.frameR:如何合计 data.frame 的每一列中的 NA 数量
【发布时间】:2014-10-09 08:25:08
【问题描述】:

要计算整个data.frame中的NA数,我可以使用sum(is.na(df),但是,如何计算大data.frame每一列中的NA数?我试过apply(df, 2, function (x) sum(is.na(df$x)),但似乎没有用。

【问题讨论】:

  • 尝试删除 df$x 中的“df$”。
  • @AndreyShabalin 请将此作为答案发布(添加一些代码,例如x <- data.frame(a = c(1, 2, NA, NA, 1), b = c(1, 1, 1, 1, NA));apply(x, 2, function(z) sum(is.na(z))) )。

标签: r


【解决方案1】:

你可以试试:

colSums(is.na(df))
#  V1 V2 V3 V4 V5 
#   2  4  2  4  4 

数据

set.seed(42)
df <- as.data.frame(matrix(sample(c(NA,0:4), 5*20,replace=TRUE), ncol=5))

【讨论】:

    【解决方案2】:

    与dplyr...

    df %>%
      summarise_all(funs(sum(is.na(.))))
    

    或使用purrr 库

    map(df, ~sum(is.na(.)))
    

    【讨论】:

      【解决方案3】:

      由于 dplyr::summarise_all 函数已通过在原始函数中使用 across 成为 superseded 并且 dplyr::funs 已被弃用,因此当前的 tidyverse 方法可能类似于:

      df %>% 
        summarise(across(everything(), ~ sum(is.na(.x))))
      

      【讨论】:

        【解决方案4】:

        你可以使用sapply:

        sapply(X = df, FUN = function(x) sum(is.na(x)))
        

        【讨论】:

          【解决方案5】:

          试试:

          apply(df, 2, function(x) length(which(is.na(x))))
          

          【讨论】:

            【解决方案6】:

            要维护每列的名称,请使用此变体(在示例中将数据框的名称替换为 df):

            apply(is.na(df), 2, sum)
            

            【讨论】:

              【解决方案7】:

              我们也可以使用dplyr函数来实现这个结果:

              df %>%
                select(everything()) %>%  
                summarise_all(funs(sum(is.na(.))))
              

              上述解决方案允许您通过将everything() 替换为您有兴趣分析的特定列来选择特定列。这对于满足特定需求很有用。如果您想进一步阅读,可以查看此页面https://sebastiansauer.github.io/sum-isna/。

              【讨论】:

                【解决方案8】:

                你可以使用

                apply(is.na(df), 2, sum)
                

                这将返回每列中可用的 NA 的总和

                例子

                
                df <- data.frame(x= as.numeric(c(1,2,3,4,5,6,6,'fg',8,8,3,4,2)),
                                 y = as.numeric(c(1,2,3,4,5,'as',7,8,9,9,1,4,2)),
                                 z = as.numeric(c(1,4,6,7,'a',12,45,7,'as',1,23,12,'la')))
                
                
                apply(is.na(df), 2, sum)
                

                输出

                x y z 
                1 1 3
                

                【讨论】:

                  【解决方案9】:

                  您可以尝试以下功能

                  1. 使用 colSums()

                    colSums(is.na(df))

                  2. 使用 apply()

                    apply(df, 2, function(x) {sum(is.na(x))})

                  3. 使用函数

                    sum.na &lt;- function (x) { sum(is.na(x)) }

                    print(sum.na(df))

                  4. 使用 lapply()

                    lapply(df, function(x) sum(is.na(x)))

                  5. 使用 sapply()

                    lapply(df, function(x) sum(is.na(x)))

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2020-09-22
                    • 2019-08-04
                    • 1970-01-01
                    • 2016-01-08
                    • 1970-01-01
                    • 2016-01-23
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多