2

条件に基づいて使用される条件と共式の表があります。

MTR                 CLD                     AF                 PI
AA                  AA                     AB                   0.5/a      (cond1)
AA                  AB                     AB                  0.5/a      (cond2)
AB                  AA                     AB                   0.5 /a     (cond3)
AA                  AA                     AA                    1/a   (cond4)
AB                  AA                     AA                     1/a   (cond5)
BB                  AB                     AA                    1/a  (cond6)
AB                  AB                     AA                    1/(a+b) (cond7)
AB                  AB                     AB                    1/(a+b)  (cond8)

条件が一致しない場合は「NA」となります。

 # table of conditions 
MTR <- c("AA",  "AA",   "AB",   "AA",   "AB",   "BB",   "AB",   "AB")
CLD <- c("AA",  "AB",   "AA",   "AA",   "AA",   "AB",   "AB",   "AB")
AF <- c("AB",   "AB",   "AB",   "AA",   "AA",   "AA",   "AA",   "AB")
PI <- c("0.5/a",    "0.5/a",    "0.5/a",    "1/a",  "1/a",  "1/a",  
      "1/(a+b)",    "1/(a+b)")

適用する 2 つのデータセットを次に示します。

# the dataset to be applied to 
dataf <- data.frame (MTR = c("AB", "BB", "AB", "BB", "AB", "AA"),
                     CLD= c("AA", "AB", "AA", "AB", "AB", "AB"),
                     AF = c("AA", "AB", "BB", "AB", "BB", "AB")
                     )


     MTR CLD AF
1  AB  AA AA 
2  BB  AB AB 
3  AB  AA BB
4  BB  AB AB
5  AB  AB BB
6  AA  AB AB

a = c(0.5, 0.4, 0.3, 0.5, 0.2, 0.4)
mapd <- data.frame(a = a, b = 1-a)

編集: 提案に従って、2 つのデータフレームを 1 つに結合できます: newdf <- data.frame (dataf, mapd)

 MTR CLD AF   a   b
1  AB  AA AA 0.5 0.5
2  BB  AB AB 0.4 0.6
3  AB  AA BB 0.3 0.7
4  BB  AB AB 0.5 0.5
5  AB  AB BB 0.2 0.8
6  AA  AB AB 0.4 0.6

if else を作成することでこれを解決できると思いますが、これが唯一の (良い) 方法であるかどうかわからない条件がたくさんあります。

 PI = NULL
 if (dataf$MTR = "AA", dataf$CLD = "AA", dataf$AF = "AB") {
                          PI =  0.5/mapd$a } else {
  if (dataf$MTR = "AA", dataf$CLD = "AB", dataf$AF = "AB"){
                          PI =  0.5/mapd$a
                          } else {
         ............. so on

これに代わるものはありますか?

4

2 に答える 2