2017-10-30 16 views
1

私は、2つの変数グループbaseline変数(var1-var5)とフォローアップ変数(tar1-tar5)を持つデータフレームを取得しています。 ID変数とを含む。このデータフレームには、欠落があります。2つの変数グループのそれぞれに1つまたは複数の非NA値があります

私はそこであるすべての観測値の数と割合を取得できるようにしたいと思います:1以上1またはVAR1-VAR5変数の複数の値の両方をtar1-tar5変数のいずれかよりも優先されます。下のmweでは、観測02-06では観測01ではなく、私の基準を満たしているので、5と0.83の割合を期待しています。

私が数と割合について得たコードは、どの変数にも欠けがないという観測を与えてくれるだけで、私はそれをどのように変更するのか分かりません。どんな助けでも大歓迎です。

ポイント開始:

df <- data.frame(ID=c("01","02","03","04","05","06"),var1=c(NA,"a","a","a","a","a"),var2=c(NA,NA,"b","b","b","b"),var3=c(NA,NA,NA,"c","c","c"),var4=c(NA,NA,NA,NA,"d","d"),var5=c(NA,NA,NA,NA,NA,"e"),tar1=c(NA,"a","a","a","a","a"),tar2=c(NA,NA,"b","b","b","b"),tar3=c(NA,NA,NA,"c","c","c"),tar4=c(NA,NA,NA,NA,"d","d"),tar5=c(NA,NA,NA,NA,NA,"e"), stringsAsFactors = FALSE) 

現在のコード:私たちは非NAと「タールである少なくとも一つの「VAR」を探しているように説明に基づいて

sum(!is.na(df$var1) & !is.na(df$var2) & !is.na(df$var3) & !is.na(df$var4) & !is.na(df$var5) & !is.na(df$tar1) & !is.na(df$tar2) & !is.na(df$tar3) & !is.na(df$tar4) & !is.na(df$tar5)) 

sum(!is.na(df$var1) & !is.na(df$var2) & !is.na(df$var3) & !is.na(df$var4) & !is.na(df$var5) & !is.na(df$tar1) & !is.na(df$tar2) & !is.na(df$tar3) & !is.na(df$tar4) & !is.na(df$tar5))/nrow(df) 

答えて

1

を、それはそう'を非NAとして扱う。この場合、データセットを 'var'列でサブセット化し、それを論理行列(!is.na(df[grep(...)]))に変換し、rowSumsを取得し、少なくとも1つの非NA要素、すなわちrowSums(...)>0があるかどうかを確認します。同じ手順を確認するために&を使用して、データの「タール」のサブセットで行われる「VAR」と「タール」の列はどの私は常に(多くの言葉で非NA要素

i1 <- rowSums(!is.na(df[grep("var", names(df))]))>0 & 
        rowSums(!is.na(df[grep("tar", names(df))]))>0 
i1 
#[1] FALSE TRUE TRUE TRUE TRUE TRUE 

sum(i1) 
#[1] 5 
mean(i1) 
#[1] 0.8333333 
0

を持っている両方か6ヵ月後に私のコードに戻っていただければ幸いですが)より一般化可能です:行の少なくとも一部がNAではない論理を返す関数を作成します。

df <- data.frame(ID=c("01","02","03","04","05","06"),var1=c(NA,"a","a","a","a","a"),var2=c(NA,NA,"b","b","b","b"),var3=c(NA,NA,NA,"c","c","c"),var4=c(NA,NA,NA,NA,"d","d"),var5=c(NA,NA,NA,NA,NA,"e"),tar1=c(NA,"a","a","a","a","a"),tar2=c(NA,NA,"b","b","b","b"),tar3=c(NA,NA,NA,"c","c","c"),tar4=c(NA,NA,NA,NA,"d","d"),tar5=c(NA,NA,NA,NA,NA,"e"), stringsAsFactors = FALSE) 

# Does the actual work 
whichRowsHaveValues <- function(dataFrame) { 
    which <- apply(X=dataFrame, FUN=function(x) any(!is.na(x)), MARGIN=1) 
    return(which) 
} 

# Choose columns 
varCols <- grepl(x=colnames(df), pattern="var", fixed=TRUE) 
tarCols <- grepl(x=colnames(df), pattern="tar", fixed=TRUE) 

# Find the answer 
goodRows <- whichRowsHaveValues(df[varCols]) & 
    whichRowsHaveValues(df[tarCols]) 
count <- sum(goodRows) 
proportion <- count/nrow(df) 

もちろん、あなたはそれがかなりので冗長、私たちは本当にすべてのそれらの中間の変数を必要としないたくないかもしれません。 。 。 。

関連する問題