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

Pls*_*svn 23 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
Run Code Online (Sandbox Code Playgroud)

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

2, 1, 3
Run Code Online (Sandbox Code Playgroud)

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

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

had*_*ley 73

colSums(!is.na(x))
Run Code Online (Sandbox Code Playgroud)

矢量化ftw.

  • 可能会改为(基于OP):`colSums(!is.na(x))`但无论如何:+1会成为你很好的灵魂. (10认同)

dar*_*zig 31

试试这个:

# 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))))
Run Code Online (Sandbox Code Playgroud)

运行:

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

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

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

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

> nonNAs(ZZZ)
[1] 2 1 3
Run Code Online (Sandbox Code Playgroud)


Gee*_*arn 6

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