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

コマンドを使用すると、もちろんdata.frame内のベクトルの数である がlength(ZZZ)得られます。これは十分に価値のある情報です。3

このdata.frameで動作する他の関数があり、ベクトルの形で答えをくれますが、長さはそのようには動作しません。

4

4 に答える 4

96
colSums(!is.na(x))

ベクトル化

于 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 に答える
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 に答える