2014-10-27 99 views
0

我有一个ifelse评估问题。数据框中的R ifelse和NAs

以下函数计算根据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”而不是公式,则条件将被正确评估。

我该如何避免这个问题?

+0

是否有一些行满足多个条件,即'e_1'和'e_2'不是'NA'和'a-b <= 11'? – 2014-10-27 13:10:54

+0

这是可能的,但它是相关的吗?这个最后的条件应该只在1或2都不适用时才被评估。 – Chris 2014-10-27 13:14:28

+1

你可以发布你提供'data.frame'到函数的代码吗?没有这些和一些数据就很难测试。 – 2014-10-27 13:17:40

回答

0

原来的问题根本不是问题的根源,而是初步评估后进行的舍入操作。圆形函数不是我的第一个问题,因为我没有怀疑它是问题,但实际上它是问题的原因。

我的问题的更简单的形式由下式表示:

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

+0

当我在带有条件的函数中使用min()时出现同样的问题。似乎向量化的ifelse()不能与某些函数结合使用。 – Chris 2014-10-28 12:39:02