FOR 循环到包含 is.na 的嵌套 IFELSE 语句

FOR Loop into nested IFELSE statements containing is.na

我已经在 FOR 循环中编写了一组 if 语句,但是循环需要超过 10 分钟才能完成 运行,并且在阅读了一篇描述如何调整IFELSE 代替 FOR 循环。

数据集头部是这样的:

Destination.City.Name Booking.ID Creation.Date Cancellation.Date Arrival.Date Status.Name Nights Room.nights DI.flag Star.rating
1             Abu Dhabi   14418661    2015-02-16        2015-02-16   2015-04-15   Cancelled     90          90       N           4
2             Abu Dhabi   14418661    2015-02-16        2015-02-16   2015-04-14   Cancelled     90          90       N           4
3             Abu Dhabi   14418661    2015-02-16        2015-02-16   2015-04-06   Cancelled     90          90       N           4
4             Abu Dhabi   14418661    2015-02-16        2015-02-16   2015-04-02   Cancelled     90          90       N           4
5             Abu Dhabi   14418661    2015-02-16        2015-02-16   2015-03-29   Cancelled     90          90       N           4
6             Abu Dhabi    9634541    2013-06-11        2013-06-13   2013-09-13   Cancelled     90          90       N           5
  Future.Arrival.Flag Future.Creation.Flag Future.Arrival.Day Status.On.Model.Date
1                   1                    1                469                   NA
2                   1                    1                468                   NA
3                   1                    1                460                   NA
4                   1                    1                456                   NA
5                   1                    1                452                   NA
6                  NA                   NA                 NA                   NA

FOR 循环实质上根据简单逻辑 Status.On.Model.Date 填充最后一列:

如果创建日期晚于模型日期,则为 NA。

如果取消日期为 NA,则确认。

如果取消日期 >= 型号日期,则确认,否则取消。

原来的FOR循环如下,如前所述,执行时有效,但耗时超过10分钟(数据集为600K+行):

i = 1
for (i in 1:length(bookingdata$Status.On.Model.Date)) {
  if (bookingdata$Creation.Date[i] > Model.Date){   
      bookingdata$Status.On.Model.Date[i] = NA     
    } else {
        if (is.na(bookingdata$Cancellation.Date[i])) {  #
            bookingdata$Status.On.Model.Date[i] = 'Confirmed'
        } else {
            if (bookingdata$Cancellation.Date[i] >= Model.Date){
                bookingdata$Status.On.Model.Date[i] = 'Confirmed'
            } else {
                if (bookingdata$Cancellation.Date[i] < Model.Date){
                    bookingdata$Status.On.Model.Date[i] = 'Cancelled'
            }
        }
    }
  }
}

我编写的新 IFELSE 代码如下:

bookingdata$Status.On.Model.Date = ifelse(bookingdata$Creation.Date > Model.Date, NA,
                                    ifelse(is.na(bookingdata$Cancellation.Date, 'Confirmed',
                                      ifelse(bookingdata$Cancellation.Date >= Model.Date, 'Confirmed', 'Cancelled'))))

但我也遇到错误:

Error in is.na(bookingdata$Cancellation.Date, "Confirmed", ifelse(bookingdata$Cancellation.Date >=  : 
  3 arguments passed to 'is.na' which requires 1

我不确定如何更正错误,因为我不知道如何重新调整语句。

谢谢!

请使用下面的代码,你漏掉了括号 is.na()

bookingdata$Status.On.Model.Date = ifelse(bookingdata$Creation.Date > Model.Date, NA,
                                        ifelse(is.na(bookingdata$Cancellation.Date), 'Confirmed',
                                          ifelse(bookingdata$Cancellation.Date >= Model.Date, 'Confirmed', 'Cancelled')))