31

假设我有以下 R data.frame ZZZ

( ZZZ <- structure(list(n = c(1, 2, NA), m = c(6, NA, NA), o = c(7, 8, 
8)), .Names = c("n", "m", "o"), row.names = c(NA, -3L), class = "data.frame") )

## not run
   n  m o
1  1  6 7
2  2 NA 8
3 NA NA 8

我想以向量的形式知道我有多少非 NA。我希望我得到的答案是:

2, 1, 3

当我使用 commandlength(ZZZ)时,我得到3了,这当然是data.frame中向量的数量,这是一条足够有价值的信息。

我有其他函数可以在这个data.frame上运行,并以向量的形式给我答案,但是,dang-it,长度不是那样运行的。

4

4 回答 4

96
colSums(!is.na(x))

矢量化ftw。

于 2011-02-13T19:15:23.030 回答
40

试试这个:

# define "demo" dataset
ZZZ <- data.frame(n=c(1,2,NA),m=c(6,NA,NA),o=c(7,8,8))
# apply the counting function per columns
apply(ZZZ, 2, function(x) length(which(!is.na(x))))

运行后:

> apply(ZZZ, 2, function(x) length(which(!is.na(x))))
n m o 
2 1 3 

如果你真的坚持要返回一个向量,你可以使用as.vector,例如通过定义这个函数:

nonNAs <- function(x) {
    as.vector(apply(x, 2, function(x) length(which(!is.na(x)))))
    }

你可以简单地运行nonNAs(ZZZ)

> nonNAs(ZZZ)
[1] 2 1 3
于 2011-02-13T18:59:31.197 回答
6

要获取缺失值的总数,请使用 sum(is.na(x)) 并按列使用 colSums(is.na(x)) 其中 x 是包含数据集的变量

于 2014-06-08T20:41:05.840 回答
3

如果您只想要总体上 NA 的总和,那么 sum() 和 !is.na() 就可以了:

ZZZ <- data.frame(n = c(1, 2, NA), m = c(6, NA, NA), o = c(7, 8, 8))
sum(!is.na(ZZZ))
于 2011-02-13T19:02:16.827 回答