数据帧中的R ifelse和NA

时间:2014-10-27 13:02:57

标签: r if-statement dataframe na

我对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”而不是公式,则正确评估条件。

我该如何避免这个问题?

1 个答案:

答案 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)的情况下评估函数,它会正确地评估条件。如果舍入完成,则仅使用最后一个条件。这种行为的原因仍然超出我的意思,因为在评估条件之后完成了舍入操作,但至少解决了手头的问题。