1

いくつかのスコアを調べて、固定のルックアップ テーブルに基づいてパーセンタイル値を割り当てる必要があります。

私はしばらくの間この問題を解決しようとしましたが、これこのSO スレッドを読みましたが、問題を解決できませんでした。私の問題は、生のスコアがルックアップ テーブルの値よりも大きくなる可能性があることです。そのような場合、最大のパーセンタイル値が規定されます。

私はこのようなルックアップテーブルを持っています、

lookup <- structure(list(Percentile = c(99, 95, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 15, 10, 5, 1), ACB = c(24, 19, 18, 17, 16, NA, 15, NA, 14, NA, NA, 13, NA, NA, NA, 12, NA, 11, 10, 9, 7), DFG = c(49, 39, 36, 33, 31, 30, 29, 28, 27, 26, 25, NA, 24, 23, 22, 21, 20, 19, 17, 14, 12), EIH = c(35, 30, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, NA, 14, NA, 13, 12, NA), GKJ = c(49, 39, 36, 33, 31, 30, 29, 28, 27, 26, 25, NA, 24, 23, 22, 21, 19, 18, 17, 15, 14), Total = c(112, 99, 91, 86, 82, 79, 76, 75, 73, 71, 69, 67, 66, 65, 63, 61, 59, 55, 51, 46, 39)), .Names = c("Percentile", "ACB", "DFG", "EIH", "GKJ", "Total"), row.names = c("99+", "95", "90", "85", "80", "75", "70", "65", "60", "55", "50", "45", "40", "35", "30", "25", "20", "15", "10", "5", "1"), class = "data.frame")
lookup
    Percentile ACB DFG EIH GKJ Total
99+         99  24  49  35  49   112
95          95  19  39  30  39    99
90          90  18  36  27  36    91
85          85  17  33  26  33    86
80          80  16  31  25  31    82
75          75  NA  30  24  30    79
70          70  15  29  23  29    76
65          65  NA  28  22  28    75
60          60  14  27  21  27    73
55          55  NA  26  20  26    71
50          50  NA  25  19  25    69
45          45  13  NA  18  NA    67
40          40  NA  24  17  24    66
35          35  NA  23  16  23    65
30          30  NA  22  15  22    63
25          25  12  21  NA  21    61
20          20  NA  20  14  19    59
15          15  11  19  NA  18    55
10          10  10  17  13  17    51
5            5   9  14  12  15    46
1            1   7  12  NA  14    39

そして、このようないくつかの生データは、

rawS_1 <- structure(list(ACB = 28, DFG = 39, EIH = 31, GKJ = NA_real_, Total = NA_real_), .Names = c("ACB", "DFG", "EIH", "GKJ", "Total"), row.names = "RawScore for ID 1", class = "data.frame")
rawS_1
                  ACB DFG EIH GKJ Total
RawScore for ID 1  28  39  31  NA    NA

rawS_2 <- structure(list(ACB = 29, DFG = 51, EIH = 56, GKJ = 60, Total = 169), .Names = c("ACB", "DFG", "EIH", "GKJ", "Total"), row.names = "RawScore for ID 2", class = "data.frame")
rawS_2
                  ACB DFG EIH GKJ Total
RawScore for ID 2  29  51  56  60   169

そして、これが私がやりたいことです。

                  ACB DFG EIH GKJ Total
RawScore for ID 1  12  39  19  NA    NA
Percentile, ID 1   25  95  50  NA    NA
                  ACB DFG EIH GKJ Total
RawScore for ID 2  29  51  56  60   169
Percentile, ID 2   99  99  99  99    99

merge()とを試してみましたが、望まないものを取得し続けてall.x = TRUEおり、助けていただければ幸いです。suffixes = c(".x",".y"))

4

2 に答える 2

2

これをマージと考えるよりも、関数を作成する問題と考えたほうがよいと思います。(たとえば) ACB の生の値が与えられたときにパーセンタイルを返す関数が必要です。幸いなことに、R には、数値の表から関数を作成するように設計された関数がありますapproxfun

次のコードはlapply、各列の関数を作成するために使用し、新しい関数を呼び出す方法を示しています。

vars <- names(lookup)[-1]
lookup_funs <- lapply(vars, function(var) {
  df <- data.frame(x = lookup[[var]], y = lookup$Percentile)
  df <- df[complete.cases(df), ]
  approxfun(df$x, df$y, "constant", rule = 2)
})
names(lookup_funs) <- vars

lookup_funs$ACB(c(12, 29))
lookup_funs$Total(169)
于 2013-01-25T12:51:42.093 に答える
1

基本的な戦略は!is.na(vec)、値とパーセタイル ベクトルの両方にインデックスを付けるために使用することです。ここでは、1 つのケースを見てみましょう。ACBの11の入力はどれがいいですか?

> rev(lookup$Percentile)[!is.na(lookup$ACB)][
                findInterval( 11, c(-Inf,rev(lookup$ACB[!is.na(lookup$ACB)]), Inf))]
[1] 20
> rev(lookup$Percentile)[!is.na(lookup$ACB)][
                findInterval( 11, c(-Inf,rev(lookup$ACB[!is.na(lookup$ACB)]), Inf))-1]
[1] 15

これにより、1行のデータのほとんどが得られます。

> for(i in names(rawS_1) ) {print(rawS_1[i]); print(rev(lookup$Percentile)[ !is.na(lookup[[i]]) ][ findInterval( rawS_1[i], c( rev( lookup[[i]][ !is.na(lookup[[i]] )]) ) )] )}
                  ACB
RawScore for ID 1  28
[1] 99
                  DFG
RawScore for ID 1  39
[1] 95
                  EIH
RawScore for ID 1  31
[1] 90
                  GKJ
RawScore for ID 1  NA
[1] NA
                  Total
RawScore for ID 1    NA
[1] NA

スケールの上限にあるインデックスから 1 を減算すると、インデックス オーバーランが発生するため、表示する結果を決定した後、ルックアップ ベクトルに要素を追加する必要があります。

for(i in names(rawS_2) ) {print(rawS_2[i]); print(rev(lookup$Percentile)[ !is.na(lookup[[i]]) ][ findInterval( rawS_2[i], c( rev( lookup[[i]][ !is.na(lookup[[i]] )]) ) )] )}
                  ACB
RawScore for ID 2  29
[1] 99
                  DFG
RawScore for ID 2  51
[1] 99
                  EIH
RawScore for ID 2  56
[1] 95
                  GKJ
RawScore for ID 2  60
[1] 99
                  Total
RawScore for ID 2   169
[1] 99
于 2013-01-25T06:41:17.150 に答える