我有一个包含大量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
谢谢:)
答案 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
,并且您不需要关心列名称(它只是总结了所有列名称)。