R中的计数变量函数

时间:2016-11-07 18:04:02

标签: r if-statement count

我正在尝试使用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)) 

2 个答案:

答案 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)*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得分的东西,你想要平均百分比正确。首先我们减去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']
}