2016-11-07 21 views
0

複数の調査項目(q1:q15)から0〜100%の新しいインデックス変数を7ptで作成しようとしています。応答スケール。 Count関数を使用してこれを実現するExcelの例が見つかりましたが、これをRで自動化したいと思います。いくつかの項目のデータが欠落しています。Rのカウント変数関数R

また、以下の項目のグループ(q1:q3、q4:q6、q7:q9、q10:q12)のそれぞれから少なくとも1つの項目がデータを持たなければならないNAにある。

structure(list(q1 = c(6L, 5L, 2L, 7L), q2 = c(5L, 5L, 6L, 7L), 
q3 = c(4L, NA, 2L, 7L), q4 = c(NA, 5L, 5L, 5L), q5 = c(NA, 
6L, 6L, 6L), q6 = c(NA, 6L, 2L, 7L), q7 = c(6L, 7L, 7L, 7L 
), q8 = c(5L, 6L, NA, 7L), q9 = c(6L, 5L, 7L, 7L), q10 = c(7L, 
NA, 5L, 7L), q11 = c(6L, 5L, 7L, 7L), q12 = c(6L, 6L, 2L, 
7L), q13 = c(6L, 5L, 6L, 7L), q14 = c(4L, 4L, 1L, 7L), q15 = c(6L, 
7L, 4L, 7L)), .Names = c("q1", "q2", "q3", "q4", "q5", "q6", 
"q7", "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"), class = "data.frame", row.names = c(NA, 
-4L)) 

コーディングは(項目のグループ内の非欠落データについての基準を除く)Excelで動作します:支援のための

=(SUM(q1:q15)-COUNT(q1:q15))/((COUNT(q1:q15)*7)-COUNT(q1:q15))*100 

感謝。

上記のインデックスの計算は、アイテムq1のq15:q15から最小可能な合計を差し引いたものです(私のスケールは1-7であるため、欠損していないアイテムの数* 1です)可能な最大合計(1〜7のスケールで、欠損していないアイテムの数* 7) - 可能な最小の合計。私は生成しようとしている出力は、各行ごとにそのcolumの値を持つ「インデックス」に新しい変数を追加します。このような

structure(list(q1 = c(6L, 5L, 2L, 7L), q2 = c(5L, 5L, 6L, 7L), 
q3 = c(4L, NA, 2L, 7L), q4 = c(NA, 5L, 5L, 5L), q5 = c(NA, 
6L, 6L, 6L), q6 = c(NA, 6L, 2L, 7L), q7 = c(6L, 7L, 7L, 7L 
), q8 = c(5L, 6L, NA, 7L), q9 = c(6L, 5L, 7L, 7L), q10 = c(7L, 
NA, 5L, 7L), q11 = c(6L, 5L, 7L, 7L), q12 = c(6L, 6L, 2L, 
7L), q13 = c(6L, 5L, 6L, 7L), q14 = c(4L, 4L, 1L, 7L), q15 = c(6L, 
7L, 4L, 7L), Index = c(NA, 75.64102564, 57.14285714, 96.66666667 
)), .Names = c("q1", "q2", "q3", "q4", "q5", "q6", "q7", 
"q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15", "Index" 
), class = "data.frame", row.names = c(NA, -4L)) 
+2

この例では、データセットのためのあなたの予想出力を共有してください。 – lmo

+0

'COUNT(q1:q15)* 7)-COUNT(q1:q15)'は 'COUNT(q1:q15)* 6'とまったく異なっていますか? – Gregor

答えて

3

何かが動作するはずです:

のは、上で動作するように関数を定義してみましょう単一行。 まず、行を3行の行列に入れ、各列のNA値を合計して入力を確認します。いずれかの列に欠損値が3つある場合は、入力確認に従ってNAを返します。

次に、数式を簡略化しようとしました。私はSUM(q1:q15)-COUNT(q1:q15)sum(x - 1)に簡略化でき、COUNT(q1:q15)*7-COUNT(q1:q15)COUNT(q1:q15)*6sum((!is.na(x)) * 6)であると信じています。

f = function(x) { 
    if (any(colSums(matrix(is.na(x), nrow = 3)) == 3)) return(NA) 
    sum(x - 1, na.rm = T)/sum((!is.na(x)) * 6) * 100 
} 
apply(df, 1, f) 
# [1] NA 75.64103 57.14286 96.66667 

編集

列として元のデータにこれを追加するには、ちょうどそれを割り当てる:このもう少し考える

res = df 
res$Index = apply(df, 1, f) 
res 
# q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 Index 
# 1 6 5 4 NA NA NA 6 5 6 7 6 6 6 4 6  NA 
# 2 5 5 NA 5 6 6 7 6 5 NA 5 6 5 4 7 75.64103 
# 3 2 6 2 5 6 2 7 NA 7 5 7 2 6 1 4 57.14286 
# 4 7 7 7 5 6 7 7 7 7 7 7 7 7 7 7 96.66667 

が、それはあなたの撮影のようなものです(x - 1)/6の平均を計算し、100を掛けます。次の関数はさらに簡単で、同じ結果が得られます。

f2 = function(x) { 
    if (any(colSums(matrix(is.na(x), nrow = 3)) == 3)) return(NA) 
    mean((x - 1)/6, na.rm = T) * 100 
} 

res$Index = apply(df, 1, f2) 

編集:は、この平均値は、あなたの非常にラウンドについての説明を入れて非常に良くな方法です:

上記指数の計算は、[アイテムのQ1のための合計:Q15マイナス最小(1〜7の尺度で、これは欠損していないアイテムの数* 1です)]を[最大可能合計(1〜7のスケールで、欠損していないアイテムの数* 7)で割ったものです。可能な最小の合計]。私が生成しようとしている出力は、各列のその列の値を持つ新しい変数 "Index"を追加します。

したがって、基本的に1-7のものを得点しています。最初にスコアを0から6にするために1を引きます(0は1よりも良い最小値です)。そして、6で除算してスコアを0から1の間の小数点にしてから、平均して欠損値を無視します。パーセンテージに変換するには100を掛けます。これは、上記のコードです:

mean((x - 1)/6, na.rm = T) * 100 
+0

ありがとうございます。あなたが提供した再現可能な出力を理解しているかどうかはわかりません。インデックスの計算の背後にある説明と、新しい変数「インデックス」を使用したデータフレーム内の望ましい出力を含めるように質問を更新しました。私がf2を実行したとき、Indexの出力は96.66667でした。これは私が投稿した出力の4行目と一致するようです。私の更新を考えれば、私が掲示した形式で出力を得るためのコーディングを示すことができますか?どうもありがとう。 – user3594490

+0

申し訳ありません私は一度に2つの質問に取り組んでいました。そして、私が最後に共有した 'dput'は他の質問に属しています。 – Gregor

+0

私は 'f'でいくつかの括弧も見逃していました - ' f'と 'f2'の両方が動作しています。結果を列に代入するコードを追加しました。 – Gregor

0
library(expss) 
dfs = structure(list(q1 = c(6L, 5L, 2L, 7L), q2 = c(5L, 5L, 6L, 7L), 
       q3 = c(4L, NA, 2L, 7L), q4 = c(NA, 5L, 5L, 5L), 
       q5 = c(NA, 6L, 6L, 6L), q6 = c(NA, 6L, 2L, 7L), 
       q7 = c(6L, 7L, 7L, 7L), q8 = c(5L, 6L, NA, 7L), q9 = c(6L, 5L, 7L, 7L), 
       q10 = c(7L, NA, 5L, 7L), q11 = c(6L, 5L, 7L, 7L), q12 = c(6L, 6L, 2L, 7L), 
       q13 = c(6L, 5L, 6L, 7L), q14 = c(4L, 4L, 1L, 7L), 
       q15 = c(6L,7L, 4L, 7L)), .Names = c("q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"), 
      class = "data.frame", row.names = c(NA, -4L)) 


dfs$Index = with(dfs,{ 
        gr1 = count_row_if(not_na, q1, q2, q3)>0 
        gr2 = count_row_if(not_na, q4, q5, q6)>0 
        gr3 = count_row_if(not_na, q7, q8, q9)>0 
        gr4 = count_row_if(not_na, q10, q11, q12)>0 
        ifelse(gr1 & gr2 & gr3 & gr4, 
        (sum_row(q1 %to% q15)- count_row_if(not_na, q1 %to% q15))/(count_row_if(not_na, q1 %to% q15)*6)*100, 
         NA 
       ) 
}) 

dfs