计算数据帧中的非NA;得到答案作为矢量

时间:2011-02-13 18:47:26

标签: r na

说我有以下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

当我使用命令length(ZZZ)时,我得到3,这当然是 data.frame 中的向量数量,这是一个非常有价值的信息。

我还有其他函数可以对这个 data.frame 进行操作,并以向量的形式给出答案,但是,dang-it,length不会像那样运行。

4 个答案:

答案 0 :(得分:70)

colSums(!is.na(x))

矢量化ftw。

答案 1 :(得分:30)

试试这个:

# 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

答案 2 :(得分:5)

为了获得缺失值的总数,使用sum(is.na(x))和colum-wise使用colSums(is.na(x)),其中x是包含数据集的变量

答案 3 :(得分:1)

如果你只需要整体NAs的总和,那么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))