我正在尝试使用7pt从多个调查项目(q1:q15)创建0-100%的新索引变量。反应规模。我在Excel中找到了一个使用Count函数完成此操作的示例,但我希望使用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) - 最小可能的总和]。我正在尝试生成的输出添加一个新变量“Index”,其中每行的列都有一个值:
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))
答案 0 :(得分:3)
这样的事情应该有效:
让我们定义一个函数来处理单行。
我首先通过将行放入3行矩阵并对每列中的NA值求和来检查输入。如果任何列有3个缺失值,我们会根据您的输入检查返回NA
。
然后我试图简化你的公式。我相信SUM(q1:q15)-COUNT(q1:q15)
可以简化为sum(x - 1)
而COUNT(q1:q15)*7-COUNT(q1:q15)
COUNT(q1:q15)*6
是sum((!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得分的东西,你想要平均百分比正确。首先我们减去1使得得分为0-6(因为0是一个比1更好的最小值),然后我们除以6使得得分小数在0-1之间,然后我们平均,忽略当然的缺失值。乘以100转换为百分比。这是上面的代码:
mean((x - 1) / 6, na.rm = T) * 100
答案 1 :(得分:0)
question = {
one: [ 'value1','value2'],
two: ['value1','value2']
}
answer = {
one: [ 'value1','value2'],
two: ['value1','value2']
}