2016-11-07 138 views
0

我試圖用7pt從多個調查項目(q1:q15)中創建0-100%的新索引變量。響應比例。我在Excel中找到了一個使用Count函數來完成此操作的示例,但我想用R自動執行此操作。某些項目缺少數據。R中的計數變量函數

我還需要指定以下標準:以下每組項目中的至少一項(q1:q3,q4:q6,q7:q9,q10:q12)必須包含數據或應產生索引在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減去最小可能的總和(因爲我的比例是1-7,這將是非遺漏項目的數量* 1)]除以[最大可能的總和(以1-7的非缺失項數* 7的比例) - 最小可能的總和]。我試圖產生的輸出增加了一個新的變量「指標」與值在科拉姆每一行:

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)* 6'有什麼不同嗎?COUNT(q1:q15)* 7)-COUNT(q1:q15) – 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) - 最小可能的總和]。從1-7

所以基本上,你是得分的東西,你想要的平均百分比正確的:我想要生成的輸出增加了一個新的變量「指標」與值在科拉姆每一行。首先,我們減去1以使分數爲0-6(因爲0比1更好),然後我們除以6以使得分數在0-1之間,然後我們平均,忽略當然的缺失值。乘以100轉換爲百分比。這是上面的代碼:

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

感謝您的回覆。我不確定我是否理解您提供的可重複輸出。我已經更新了我的問題,在索引計算背後加入了一些解釋,並在數據框中添加了新變量「索引」所需的輸出。當我運行f2時,索引的輸出是96.66667,看起來與我發佈的期望輸出的第4行相匹配。鑑於我的更新,您是否能夠演示編碼以獲得我發佈的格式的輸出?非常感謝。 – user3594490

+0

對不起!我正在同時處理兩個問題,我在底部分享的「輸入」屬於另一個問題。 – Gregor

+0

我也錯過了'f'中的幾個parens - 現在'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