R:根据标准分配值

时间:2018-01-23 13:56:24

标签: r if-statement merge match sapply

我正在尝试将测试分数从第一个数据集中的心理调查问卷转换为另一个数据集中的标准化分数(百分位数范围)

考试成绩是我调查问卷的9人中的一个分数

TestResults <- data.frame(ID = c(1:9),   
               Observed = c(14, 8, 33, 23, 5, 79, 2, 11, 5), Results = NA) 

来自测试发布者的评分表在R中手动实现,为简单起见,此处缩短

ScoringSheet <- data.frame(Percentiles = c(99,95,85,55,10), Score = c(79,33,20,15,5))

我想在列Results中填充ScoringSheet中观察到的分数的相应百分位数值。对于评分,应用一个简单的算法,我无法在R

中实现

1如果TestResults$Observed %in% ScoringSheet$Score,则Results应为Percentiles中相应的ScoringSheet值。
如果!(TestResults$Observed %in% ScoringSheet$Score)为{2},那么TestResults$Results应该是ScoringSheet$Percentiles得分落后的两个Observed的平均值 3如果TestResults$Observed < min(ScoringSheet$Score),则这些最小观察值的Results值应为min(ScoringSheet$Percentiles)/2

结果,我需要这个

TestResults <- data.frame(ID = c(1:9), 
                           Observed = c(14, 8, 33, 23, 5, 79, 2, 11, 5), 
                           Results = c(0.5,0.5,95,90,0.5,99,0.5,0.5,0.5))

到目前为止,我可以使用merge()TestResults$Observed上的ScoringSheet$Score获取标准1的相应百分位数,为不完全匹配的值创建NA。我现在想知道如何实施标准2和3.

提前谢谢!

1 个答案:

答案 0 :(得分:0)

可能不是最好的解决方案,但它能完成这项工作。首先我们对ScoringSheet进行排序,然后我们使用match来查找完全匹配。最后,我们遍历未找到完全匹配的所有记录,并在那里应用您的计算。我在分数高于第99百分位数时添加了一条规则,其中它等于最高百分位分数。我还添加了两个条目,以表明下面的代码正常工作。

TestResults <- data.frame(ID = c(1:11),   
                          Observed = c(14, 8, 33, 23, 5, 79, 2, 11, 5,100,55), Results = NA) 

ScoringSheet <- data.frame(Percentiles = c(99,95,85,55,10), Score = c(79,33,20,15,5))

ScoringSheet = ScoringSheet[order(ScoringSheet$Score,decreasing = F),]
TestResults$Results = ScoringSheet$Percentiles[match(TestResults$Observed,ScoringSheet$Score)]
for(i in which(is.na(TestResults$Results)))
{
  x = tail(which((TestResults$Observed[i]>ScoringSheet$Score)),1)
  if(!length(x)==0)
  {
    TestResults$Results[i] = mean(ScoringSheet$Percentiles[c(x,min(x+1,nrow(ScoringSheet)))])
  }
  else
  {
    TestResults$Results[i] = ScoringSheet$Percentiles[1]/2
  }
}

输出:

   ID Observed Results
1   1       14    32.5
2   2        8    32.5
3   3       33    95.0
4   4       23    90.0
5   5        5    10.0
6   6       79    99.0
7   7        2     5.0
8   8       11    32.5
9   9        5    10.0
10 10      100    99.0
11 11       55    97.0

希望这有帮助!