Скрипт Spotfire TERR для проверки того, находится ли строка даты в диапазоне дат

startDate="04/01/2015"
endDate="07/01/2015"
dateString="04/30/2015 03/21/2015 06/28/2015 12/19/2015"

Я хочу иметь вычисляемый столбец, который возвращает «Да», если все даты в dateString находятся между startDate и endDate, и «Нет» в противном случае.

Обратите внимание: dateString может иметь любое количество дат.

Я попытался написать скрипт TERR (возвращаемый тип String):

MyCustomFunction <- function(startDate, endDate, dateString) {
    v1 <- scan(text=dateString, what='', quiet=TRUE)
    v2 <- as.Date(v1, '%m/%d/%Y')
    temp <- v2 >= as.Date(startDate, '%m/%d/%Y') & v2 <= as.Date(endDate,'%m/%d/%Y')
    ifelse(length(unique(temp))==1, ifelse(unique(temp)==TRUE, test<-as.character(TRUE), test<-as.character(FALSE)), test<-as.character(FALSE))
    test
}
output <- MyCustomFunction(startDate = input1, endDate = input2, dateString = input3)

Но это отображает пустой столбец. Может ли кто-нибудь помочь мне с этим? Или предложить альтернативное решение? Я использую Spotfire версии 6.5.

Заранее спасибо.


person ashetty    schedule 30.07.2015    source источник
comment
Что вы подразумеваете под любым количеством дат? Вы имеете в виду разные форматы даты? Или вы имеете в виду, что диапазон дат может быть другим? Также dateStrings расположены в строковом столбце?   -  person phiver    schedule 31.07.2015
comment
@phiver Под любым количеством дат я имел в виду, что dateString может быть любой из следующих: 30.04.2015 21.03.2015 28.06.2015 19.12.2015 ИЛИ 30.04.2015 21.03.2015 ИЛИ 30.04.2015 21.03.2015 28.06.2015 ИЛИ 30.04.2015.... Форматы даты всегда одинаковы. И да, столбец строки даты имеет строковый тип.   -  person ashetty    schedule 31.07.2015


Ответы (1)


Я немного подкорректировал ваш код. Spotfire устанавливает вход как вектор. Настройте входы и выходы по своему усмотрению. Я использовал strsplit, потому что предполагаю, что данные выглядят так.введите здесь описание изображения

также нет необходимости в присваиваниях внутри вашего оператора ifelse. Вы просто присваиваете результат своей переменной. Я протестировал этот код в Spotfire 6.5 и получил правильные результаты.

startDate <- "01/01/2015"
endDate <- "07/01/2015"

MyCustomFunction <- function(startDate, endDate, dateString) {
      outcome <- NULL
      for (i in 1:length(dateString)) {
      v1 <- strsplit(dateString[i], " ", fixed = TRUE)
      v2 <- as.Date(unlist(v1), '%m/%d/%Y')
      temp <- v2 >= as.Date(startDate, '%m/%d/%Y') & v2 <= as.Date(endDate,'%m/%d/%Y')
      outcome <- c(test, ifelse(length(unique(temp))==1, ifelse(unique(temp)==TRUE, as.character(TRUE), as.character(FALSE)), as.character(FALSE)))
      }
      return(outcome)
}

output <- MyCustomFunction(startDate, endDate, dateString)
person phiver    schedule 31.07.2015
comment
это работает, но только что обнаружил, что Spotfire требует много времени для создания вычисляемого столбца, вероятно, потому, что там около 25 000 нечетных записей. Можете ли вы придумать более быструю альтернативу? - person ashetty; 03.08.2015