计算数据帧中每列的非NA值的数量

Pet*_*ter -1 datatable dataframe

我有一个包含大量NAs和一些非Na值的大数据集.目前我计算NA每列的非值,如下所示:

 attach(df)
 1000 - (sum(is.na(X1)))
 1000 - (sum(is.na(X2)))
 1000 - (sum(is.na(X3)))
 1000 - (sum(is.na(X4)))
 1000 - (sum(is.na(X5)))
 ...
 detach(df)
Run Code Online (Sandbox Code Playgroud)

所以我的观察总长度 - 我的NA价值总和.

有没有更快的方法使用更少的代码行和打字工作,并让我快速概述所有列和非NA值的数量?

像for循环或什么?

我正在寻找这样的东西:

  X1     Amount of Non-Na-Values
  X2     ...
  X3     ...
  X4
  X5
  X6  
Run Code Online (Sandbox Code Playgroud)

谢谢 :)

ali*_*ire 8

您还可以调用is.na整个数据帧(隐式强制转换为逻辑矩阵)并调用colSums反向响应:

# make sample data
set.seed(47)
df <- as.data.frame(matrix(sample(c(0:1, NA), 100*5, TRUE), 100))

str(df)
#> 'data.frame':    100 obs. of  5 variables:
#>  $ V1: int  NA 1 NA NA 1 NA 1 1 1 NA ...
#>  $ V2: int  NA NA NA 1 NA 1 0 1 0 NA ...
#>  $ V3: int  1 1 0 1 1 NA NA 1 NA NA ...
#>  $ V4: int  NA 0 NA 0 0 NA 1 1 NA NA ...
#>  $ V5: int  NA NA NA 0 0 0 0 0 NA NA ...

colSums(!is.na(df))
#> V1 V2 V3 V4 V5 
#> 69 55 62 60 70
Run Code Online (Sandbox Code Playgroud)


arg*_*t91 6

有了dplyr,这将是:

library(dplyr)

df %>%
summarise_all(funs(sum(!is.na(.)))
Run Code Online (Sandbox Code Playgroud)

该方法的优点是您可以group_by在之前使用,并且您不需要关心列名(它只是汇总了所有列名)。


Mel*_*Key 5

尝试这个:

nonNA_counts <- sapply(df, function(x) sum(!is.na(x)))
Run Code Online (Sandbox Code Playgroud)

  • @MikaelPoulJohannesson通常,我们在矩阵上使用“apply”,在数据帧上使用“sapply”或“lapply”。(在这种情况下,这并不重要......) (2认同)