【问题标题】:Determine the number of NA values in a column确定列中 NA 值的数量
【发布时间】:2014-07-24 12:33:13
【问题描述】:

我想计算数据框列中NA 值的数量。假设我的数据框名为df,而我正在考虑的列的名称是col。我想出的方法如下:

sapply(df$col, function(x) sum(length(which(is.na(x)))))  

这是一种很好/最有效的方法吗?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    获得所有列的 NA 计数的快速简便的 Tidyverse 解决方案是使用 summarise_all(),我认为这比使用 purrrsapply 更容易阅读解决方案

    library(tidyverse)
    # Example data
    df <- tibble(col1 = c(1, 2, 3, NA), 
                 col2 = c(NA, NA, "a", "b"))
    
    df %>% summarise_all(~ sum(is.na(.)))
    #> # A tibble: 1 x 2
    #>    col1  col2
    #>   <int> <int>
    #> 1     1     2
    

    或者使用更现代的across()函数:

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

    【讨论】:

      【解决方案2】:

      如果您要在每一列中查找空值以一个接一个地打印,那么您可以使用它。简单的解决方案。

      lapply(df, function(x) { length(which(is.na(x)))})
      

      【讨论】:

        【解决方案3】:

        为了完整起见,您还可以使用表中的useNA 参数。例如table(df$col, useNA="always") 将计算所有非NA 的情况和NA 的情况。

        【讨论】:

          【解决方案4】:
          sapply(name of the data, function(x) sum(is.na(x)))
          

          【讨论】:

          • 见“Explaining entirely code-based answers”。虽然这在技术上可能是正确的,但它并不能解释为什么它可以解决问题或应该是选择的答案。除了帮助解决问题,我们还应该进行教育。
          【解决方案5】:

          类似于 hute37 的答案,但使用 purrr 包。我认为这种 tidyverse 方法比 AbiK 提出的答案更简单。

          library(purrr)
          map_dbl(df, ~sum(is.na(.)))
          

          注意:波浪号 (~) 创建一个匿名函数。和'。指匿名函数的输入,在本例中为 data.frame df

          【讨论】:

            【解决方案6】:

            您可以使用它来计算每列中 NA 或空白的数量

            colSums(is.na(data_set_name)|data_set_name == '')
            

            【讨论】:

              【解决方案7】:

              试试colSums函数

              df <- data.frame(x = c(1,2,NA), y = rep(NA, 3))
              
              colSums(is.na(df))
              
              #x y 
              #1 3 
              

              【讨论】:

              • 如果您要处理许多列,您可以使用 ´ colSums(is.na(df)) %>% as.data.frame() ´ 或 ´ as.data 获得更好的输出。框架(colSums(is.na(df))) ´
              【解决方案8】:

              我从本地目录中读取了一个 csv 文件。以下代码对我有用。

              # to get number of which contains na
              sum(is.na(df[, c(columnName)]) # to get number of na row
              
              # to get number of which not contains na
              sum(!is.na(df[, c(columnName)]) 
              
              #here columnName is your desire column name
              

              【讨论】:

                【解决方案9】:

                一种计算数据帧每列中空值数量的简洁方法:

                library(tidyverse)
                library(purrr)
                
                df %>%
                    map_df(function(x) sum(is.na(x))) %>%
                    gather(feature, num_nulls) %>%
                    print(n = 100)
                

                【讨论】:

                • 你甚至不需要咕噜声:df %&gt;% summarise_all(funs(sum(is.na(.))))
                • 如果你像我一样懒惰,你可以在@Abi K 的答案中用更短的 purrr 语法写相同的内容:df %&gt;% map_df(~sum(is.na(.))) 或不使用 dplyr 作为map_df(~sum(is.na(df)))
                【解决方案10】:

                用户 rrs 的答案是正确的,但这只会告诉您要传递的数据框特定列中的 NA 值的数量,以获取整个数据框的 NA 值的数量试试这个:

                apply(<name of dataFrame>, 2<for getting column stats>, function(x) {sum(is.na(x))})
                

                这就是诀窍

                【讨论】:

                • 有一些拼写错误导致此代码无法正常工作。尝试这个; apply(df, 2, function(x) sum(is.na(x)))
                【解决方案11】:

                summary() 输出中,该函数还计算NAs,因此如果想要多个变量中NAs 的总和,可以使用此函数。

                【讨论】:

                • 值得注意的是,summary 输出在单个列上使用时是可用的,而它来自整个数据帧的输出是字符,如果以后需要它们,计数很难提取。见c(summary(mtcars))
                【解决方案12】:

                试试这个:

                length(df$col[is.na(df$col)])
                

                【讨论】:

                  【解决方案13】:

                  这种形式,与 Kevin Ogoros 的形式略有不同:

                  na_count <-function (x) sapply(x, function(y) sum(is.na(y)))
                  

                  返回 NA 计数作为命名的 int 数组

                  【讨论】:

                  • 以列表形式获取结果:na_count &lt;-function (x) lapply(x, function(y) sum(is.na(y)))
                  【解决方案14】:

                  如果您正在寻找数据框中每一列的 NA 计数,那么:

                  na_count <-sapply(x, function(y) sum(length(which(is.na(y)))))
                  

                  应该给你一个包含每列计数的列表。

                  na_count <- data.frame(na_count)
                  

                  应该在如下数据框中很好地输出数据:

                  ----------------------
                  | row.names | na_count
                  ------------------------
                  | column_1  | count
                  

                  【讨论】:

                  • 要将行名包含为一列,请同时运行na_count$name&lt;-rownames(na_count)
                  • na_count &lt;-sapply(x, function(y) sum(is.na(y))) 是一个较短的选择。
                  • 对我不起作用 :( 必须将其更改为:na_count
                  • 我认为我们不需要同时使用 sum 和 length 函数(在第一个 na_count 分配中)?只要长度就足够了。
                  【解决方案15】:

                  如果您想计算整个数据框中的 NA 数量,您也可以使用

                  sum(is.na(df))
                  

                  【讨论】:

                    【解决方案16】:

                    你想太多问题了:

                    sum(is.na(df$col))
                    

                    【讨论】:

                    • 谢谢你。稍微扩展一下。在计算任意value 的数量时,除了NA 之外,正在编写一个布尔函数is.value,然后使用sum(is.value(df$col)) 是要走的路还是有更简洁的直接语法?
                    • 问得太快了。 sum(df$col==value,na.rm=FALSE) 成功了。
                    • @user3274289:虽然你通常需要na.rm=TRUE,否则如果df$col 包含NA,sum 将返回NA
                    • 有时我觉得我想多了,直到我得到这个答案......嗯,这是真的......
                    • 对不起,但这对我不起作用。我收到此警告警告消息:在 is.na(nom$wd) 中:is.na() 应用于“NULL”类型的非(列表或向量),并且计数为零。
                    猜你喜欢
                    • 2018-12-22
                    • 2021-11-24
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-07-02
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-09-13
                    相关资源
                    最近更新 更多