在R中向量化if-else塔的正确方法

时间:2019-06-19 14:17:09

标签: r data.table vectorization

我遇到了以下帖子:Vectorized IF statement in R?,它涉及R中一个if-else构造的泛化。但是,我不想在R中构建嵌套的$ ifelse $函数,还有另一种方法吗?为此吗?

作为一个例子,我有这个:

library(data.table)
precalc_nrcolumns <- function(TERM_DATE, CHANGE_DATE){
  if(CHANGE_DATE < TERM_DATE){
    if(CHANGE_DATE == 0) {
      if(TERM_DATE > 100) {
        nrcolumns <- 100
      }else{
        nrcolumns <-  TERM_DATE
      }
    }else{
      nrcolumns <- CHANGE_DATE
    }
  }else{
    nrcolumns <- 100
  }
  return(nrcolumns)
}


test.data <- data.table(TERM_DATE = sample(1:500, 100, replace=TRUE),
           CHANGE_DATE = sample(1:500, 100, replace=TRUE))

test.data[, value := mapply(precalc_nrcolumns, TERM_DATE, CHANGE_DATE)]

我完全知道使用mapply确实有效,但是我想知道还有什么其他方法可以解决这个问题。

1 个答案:

答案 0 :(得分:2)

一种可能的方法:

test.data[, val := pmin(CHANGE_DATE, TERM_DATE)][
    CHANGE_DATE==0L, val := pmin(100L, TERM_DATE)][
        CHANGE_DATE >= TERM_DATE, val := 100L]

数据:

set.seed(0L)
library(data.table)
nr <- 300
test.data <- data.table(TERM_DATE = sample(0:150, nr, replace=TRUE),
    CHANGE_DATE = sample(0:150, nr, replace=TRUE))