我有一个条件表和要根据条件使用的公式:
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)")
以下是要应用的两个数据集:
# 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)
编辑:按照建议,我可以将两个数据帧合并为一个: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
有没有其他选择?