我对ifelse评估有疑问。
以下函数根据3个条件进行评估:
mk <- function(a, b, c, d, e_1, e_2, f, k)
# condition 1
ifelse (!is.na(e_1) & !(k %in% 1),
mk <- d - e_1 * c,
# condition 2
ifelse (!is.na(e_2) & !(k %in% 1),
mk <- e_2 - d * c,
# condition 3
ifelse((a - b) <= 11,
mk <- c * a - b * f,
mk <- c * f
))
)
如果我解析单个元素,则函数会正确计算,但如果我将数据帧的行作为输入值,则函数只会在最后一个条件中使用计算,即使满足前面的条件。包含e_1,e_2和k值的列中有一些NA,我怀疑这是问题。我没有得到的是为什么NA'强制整个矢量被评估为条件3,即使它们实际上从未用于计算,因为条件应该排除它们的使用。如果我用字符替换计算,即写“使用条件1/2/3”而不是公式,则正确评估条件。
我该如何避免这个问题?
答案 0 :(得分:0)
原来,NA根本不是问题的原因,而是在初始评估之后完成的舍入操作。圆函数不是我的第一个问题,因为我没有怀疑它是问题,但它实际上是问题的原因。
我的问题的一个更简单的形式由:
表示mktest <- function(a, b, e_1, e_2, k) {
# condition 1
ifelse (!is.na(e_1) & !(k %in% 1),
mk <- 1 - e_1,
# condition 2
ifelse (!is.na(e_2) & !(k %in% 1),
mk <- 2 - e_2,
# condition 3
ifelse((a - b) <= 1,
mk <- -a * b,
mk <- a * 2
))
)
round(mk,0)
}
# some testdata with all possible combinations of values in my data frame
test <- data.frame(expand.grid(2:3, 1, c(1,NA), c(1,NA), c(0,1,NA)))
names(test)[1] <- "a"
names(test)[2] <- "b"
names(test)[3] <- "e_1"
names(test)[4] <- "e_2"
names(test)[5] <- "k"
# visualize conditions
test$cond1 <- !is.na(test$e_1) & !(test$k %in% 1)
test$cond2 <- !is.na(test$e_2) & !(test$k %in% 1)
test$cond3 <- ((test$a - test$b) <= 1)
# results
test$result <- mktest(test$a, test$b, test$e_1, test$e_2, test$k)
如果我在最后没有圆(mk,0)的情况下评估函数,它会正确地评估条件。如果舍入完成,则仅使用最后一个条件。这种行为的原因仍然超出我的意思,因为在评估条件之后完成了舍入操作,但至少解决了手头的问题。