R:根据标准分配价值
R: assign value based on criteria
我正在尝试将第一个数据集中的心理问卷测试分数转换为另一个数据集中的标准化分数(百分位数范围)
测试分数是 9 个人参加我的问卷的分数
TestResults <- data.frame(ID = c(1:9),
Observed = c(14, 8, 33, 23, 5, 79, 2, 11, 5), Results = NA)
评分 sheet,来自测试发布者,在 R 中手动实现,为简单起见在此处缩短
ScoringSheet <- data.frame(Percentiles = c(99,95,85,55,10), Score = c(79,33,20,15,5))
我想用 ScoringSheet
中观察到的分数的相应百分位值填充列 Results
。对于评分,应用了一个简单的算法,我无法在 R
中实现它
1 如果TestResults$Observed %in% ScoringSheet$Score
,那么Results
应该是ScoringSheet
.
中对应的Percentiles
值
2 如果 !(TestResults$Observed %in% ScoringSheet$Score)
,则 TestResults$Results
应该是 Observed
分数落在
之间的两个 ScoringSheet$Percentiles
的平均值
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))
到目前为止,我可以在 TestResults$Observed
和 ScoringSheet$Score
上使用 merge()
获得标准 1 的相应百分位数,为不完全匹配的值创建 NA。我现在想知道如何实施标准 2 和 3。
提前致谢!
可能不是最好的解决方案,但它可以完成工作。首先我们对 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
希望对您有所帮助!
我正在尝试将第一个数据集中的心理问卷测试分数转换为另一个数据集中的标准化分数(百分位数范围)
测试分数是 9 个人参加我的问卷的分数
TestResults <- data.frame(ID = c(1:9),
Observed = c(14, 8, 33, 23, 5, 79, 2, 11, 5), Results = NA)
评分 sheet,来自测试发布者,在 R 中手动实现,为简单起见在此处缩短
ScoringSheet <- data.frame(Percentiles = c(99,95,85,55,10), Score = c(79,33,20,15,5))
我想用 ScoringSheet
中观察到的分数的相应百分位值填充列 Results
。对于评分,应用了一个简单的算法,我无法在 R
1 如果TestResults$Observed %in% ScoringSheet$Score
,那么Results
应该是ScoringSheet
.
中对应的Percentiles
值
2 如果 !(TestResults$Observed %in% ScoringSheet$Score)
,则 TestResults$Results
应该是 Observed
分数落在
之间的两个 ScoringSheet$Percentiles
的平均值
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))
到目前为止,我可以在 TestResults$Observed
和 ScoringSheet$Score
上使用 merge()
获得标准 1 的相应百分位数,为不完全匹配的值创建 NA。我现在想知道如何实施标准 2 和 3。
提前致谢!
可能不是最好的解决方案,但它可以完成工作。首先我们对 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
希望对您有所帮助!