[英]R ifelse and NAs within dataframes
我对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'S强制将整个向量都作为条件3进行评估,即使实际上它们从未在计算中使用,因为条件应该排除它们的使用。 如果我用字符替换计算,即写“使用条件1/2/3”而不是公式,则可以正确评估条件。
我如何避免这个问题?
事实证明,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)
如果我在最后没有round(mk,0)的情况下评估函数,则它会正确评估条件。 如果舍入完成,则仅使用最后一个条件。 这种行为的原因仍然不在我的考虑范围内,因为四舍五入运算是在条件评估之后进行的,但是至少可以解决当前的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.