【问题标题】:R ifelse and NAs within dataframes数据帧中的 R ifelse 和 NA
【发布时间】:2014-12-22 16:04:18
【问题描述】:

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

如何避免这个问题?

【问题讨论】:

  • 是否有一些行满足多个条件,即'e_1`和e_2不是NAa-b &lt;= 11
  • 有可能,但是否相关?只有当 1 或 2 都不适用时,才应评估最后一个条件。
  • 您能否发布将data.frame 提供给函数的代码?没有这些和一些数据,这很难测试。
  • 原来问题是一个舍入函数,我什至没有怀疑是问题的一部分

标签: r if-statement dataframe na


【解决方案1】:

事实证明,NA 根本不是问题的原因,而是在初始评估后进行的舍入操作。 round 函数不在我的第一个问题中,因为我没有怀疑它是问题所在,但它实际上是问题的原因。

我的问题的一个更简单的形式表示为:

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

【讨论】:

  • 当我在有条件的函数中使用 min() 时,也会出现同样的问题。似乎矢量化 ifelse() 不能与某些函数一起使用。
猜你喜欢
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 2018-12-07
  • 2020-12-03
  • 2020-08-16
相关资源
最近更新 更多