Правильный способ векторизации if-else башни в R - PullRequest
0 голосов
/ 19 июня 2019

Я наткнулся на следующий пост: Векторизованный оператор IF в R? , который имеет дело с vecotrisation одной конструкции if-else в R. Однако я не хочу создавать вложенные функции $ ifelse $ в R, есть ли другой способ сделать это?

В качестве примера у меня есть это:

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 Ответ

2 голосов
/ 20 июня 2019

Возможный подход:

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))
...