我正在尝试将测试分数从第一个数据集中的心理调查问卷转换为另一个数据集中的标准化分数(百分位数范围)
考试成绩是我调查问卷的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.
提前谢谢!
答案 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
希望这有帮助!