【问题标题】:Count number of non-NA values for every column in a dataframe [duplicate]计算数据框中每一列的非 NA 值的数量 [重复]
【发布时间】:2018-05-15 19:15:14
【问题描述】:

我有一个大数据集,其中包含很多 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)

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

有没有一种更快的方法,它使用更少的代码行和打字工作,让我快速了解所有非NA 值的列和数量?

像 for 循环之类的?

我正在寻找这样的东西:

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

谢谢你:)

【问题讨论】:

  • 不要使用attach,导致的问题多于解决的问题。
  • 很容易产生错误。如果您对数据进行任何子集化、分组或重新排列,您附加的列可能会彼此不同步,并且与实际数据不同步。还有更好的选择:许多函数都有一个data 参数,所以你根本不需要它,你可以使用with() 做其他任何事情。见Why is it advisable to not use attach() in R? 和When to use with() and why is it good?

标签: r dataframe


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    使用dplyr,那就是:

    library(dplyr)
    
    df %>%
    summarise_all(funs(sum(!is.na(.))))
    #  V1 V2 V3 V4 V5
    #1 65 66 70 62 74
    

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

    【讨论】:

      【解决方案3】:

      试试这个:

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

      【讨论】:

      • 对于数据帧的colwise操作,apply(df, 2, function(x) sum(!is.na(x)))不是更一致吗?
      • @MikaelPoulJohannesson 通常,我们在矩阵上使用apply,在数据帧上使用sapply 或lapply。 (在这种情况下,这并不重要......)
      猜你喜欢
      • 2016-10-14
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 2017-04-08
      相关资源
      最近更新 更多