2016-09-26 6 views
2

三つの変数で構成以下のいずれかのように設定小さなデータ、想像数を計算するために、次のように欠損値の特定の数と行数

v1 <- c(0, 1, NA, 1, NA, 0) 
v2 <- c(0, 0, NA, 1, NA, NA) 
v3 <- c(1, NA, 0, 0, NA, 0) 
df <- data.frame(v1, v2, v3) 

df 
    v1 v2 v3 
1 0 0 1 
2 1 0 NA 
3 NA NA 0 
4 1 1 0 
5 NA NA NA 
6 0 NA 0 

一つはis.naコマンドを使用することができますが

sum(is.na(df$v1) | is.na(df$v2) | is.na(df$v3)) 

または3つのすべての値が欠落していると行の数を - とR 1を返すことになる: - 少なくとも一つの欠損値を持つ行およびR 4を返す

sum(is.na(df$v1) & is.na(df$v2) & is.na(df$v3)) 

2つの質問:

(1)「正確に1つ」または「正確に2つ」の値がない行の数はどのようにして計算できますか?

(2)大きなデータセットで上記を実行する場合、計算の範囲をv1、v2、v3に制限するにはどうすればよいですか(つまり、サブセットを作成する必要はありません)。

私はis.na、nrow、dfのバリエーションを試しましたが、いずれも動作させることができませんでした。

ありがとうございます!

答えて

3

論理行列(is.na(df))にrowSumsを使用して、NAsの数が関心のある値と等しいかどうかを確認できます。

n1 <- 1 
sum(rowSums(is.na(df))==n1) 

は、それを容易に行うための関数を作成するには、この

f1 <- function(dat, n){ 
      sum(rowSums(is.na(dat)) == n) 
     } 


f1(df, 0) 
#[1] 2 
f1(df, 1) 
#[1] 2 

f1(df, 3) 
#[1] 1 
f1(df, 2) 
#[1] 1 

注:rowSumsは非常に高速ですが、それは、その後もで問題を作成することができ、論理行列を作る大規模なデータセットである場合、メモリ。したがって、データセット(lapply(df, is.na))の列をループした後にReduceを使用することができます。

sum(Reduce(`+`, lapply(df, is.na))==1) 
#[1] 2 

f2 <- function(dat, n){ 
     sum(Reduce(`+`, lapply(dat, is.na))==n) 
} 

f2(df, 1) 
1

これを試してください:あなたは非効率的な方法で、ここで車輪の再発明している

num.rows.with.x.NA <- function(df, x, cols=names(df)) { 
    return(sum(apply(df, 1, function(y) sum(is.na(y[cols])) == x))) 
} 

df 

    v1 v2 v3 
1 0 0 1 
2 1 0 NA 
3 NA NA 0 
4 1 1 0 
5 NA NA NA 
6 0 NA 0 

num.rows.with.x.NA(df, 0, names(df)) 
#[1] 2 
num.rows.with.x.NA(df, 1, names(df)) 
#[1] 2 
num.rows.with.x.NA(df, 2, names(df)) 
#[1] 1 
num.rows.with.x.NA(df, 3, names(df)) 
#[1] 1 
+3

。 Rはこれらすべての機能をベクトル化しています –

+0

はい、私たちはrowSums/Reduceを使用することができます。 –

関連する問題