计算数据框

时间:2018-05-15 19:15:14

标签: dataframe datatable

我有一个包含大量NA s和一些非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)

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

是否有更快的方式使用更少的代码行和输入工作量,并让我快速了解非NA值的所有列和数量?

像for循环还是什么?

我正在寻找类似的东西:

  X1     Amount of Non-Na-Values
  X2     ...
  X3     ...
  X4
  X5
  X6  

谢谢:)

3 个答案:

答案 0 :(得分:7)

您也可以在整个数据框上调用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

答案 1 :(得分:4)

试试这个:

nonNA_counts <- sapply(df, function(x) sum(!is.na(x)))

答案 2 :(得分:2)

使用dplyr,即:

library(dplyr)

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

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