[英]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)
來自測試發布者的評分表,在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
應該是對應Percentiles
在值ScoringSheet
。
2,如果!(TestResults$Observed %in% ScoringSheet$Score)
然后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))
到目前為止,我可以在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
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.