Разбейте строки, представляющие длинные интервалы времени, на несколько строк

Возможное решение, которое не зависит от конкретного представления IEEE для используемого NaN, будет следующим:

template<class T>
bool isnan( T f ) {
    T _nan =  (T)0.0/(T)0.0;
    return 0 == memcmp( (void*)&f, (void*)&_nan, sizeof(T) );
}
2
задан J. Komen 16 January 2019 в 15:15
поделиться

1 ответ

Вот, пожалуйста:

Используя df в качестве фрейма данных:

df = data.frame(IDNR = 1:3, 
                start = c("2018-02-15","2017-10-30","2016-02-11"),
                end = c("2018-07-01","2018-07-01","2016-12-03"),
                exposure = c(0,0,1))

Do:

library(lubridate)    

newDF = apply(df, 1, function(x){
    newStart = seq(from = ymd(x["start"]), to = ymd(x["end"]), by = 90)
    newEnd = c(seq(from = ymd(x["start"]), to = ymd(x["end"]), by = 90)[-1], ymd(x["end"]))
    d = data.frame(IDNR = rep(x["IDNR"], length(newStart)), 
                   start = newStart, 
                   end = newEnd, 
                   exposure = rep(x["exposure"], length(newStart)))
})

newDF = do.call(rbind, newDF)

newDF = newDF[newDF$start != newDF$end,]

Результат:

> newDF
  IDNR      start        end exposure
1    1 2018-02-15 2018-05-16        0
2    1 2018-05-16 2018-07-01        0
3    2 2017-10-30 2018-01-28        0
4    2 2018-01-28 2018-04-28        0
5    2 2018-04-28 2018-07-01        0
6    3 2016-02-11 2016-05-11        1
7    3 2016-05-11 2016-08-09        1
8    3 2016-08-09 2016-11-07        1
9    3 2016-11-07 2016-12-03        1

Это создает последовательность дней от start до end на 90 дней и создает с ними меньший фрейм данных вместе с IDNR и exposure. Это действие вернет список фреймов данных, которые вы можете объединить, используя do.call. В последней строке удаляются строки с одинаковыми датами start и end

0
ответ дан R. Schifini 16 January 2019 в 15:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: