代码之家  ›  专栏  ›  技术社区  ›  Jochem

评估错误:未为“日期”对象定义(&N)

  •  0
  • Jochem  · 技术社区  · 7 年前

    我试着按装运期的长短按比例计算。为了实现这一点,我在一个“mutate”函数中创建了一个if结构。执行此操作时,会出现以下错误:

    评估错误:未为“日期”对象定义

    我曾试图在互联网上搜索答案,但这并没有产生一个帮助我使代码工作的资源。如果你能帮忙的话,我理解。下面是一个可复制的例子。

    数据集:

    shipments_sample <- structure(list(StartDate = structure(c(18123, 17756, 17833, 17700, 17608, 18083), class = "Date"), EndDate = structure(c(18167, 17802, 17859, 17762, 17674, 18135), class = "Date"), FromRegion = c("Europe", "Europe", "Asia", "Europe", "Asia", "Asia"), ToRegion = c("Europe", "North America", "North America", "Europe", "North America", "Europe"), FreightDays = c(42, 46, 25, 60, 60, 50), DemurrageDays = c(2, 0, 1, 2, 6, 2), Rev_Demurrage = c(15, 0, 7.5, 15, 45, 15), Rev_Freight = c(3120.36990205105, 2770.19243720274, 3263.27948309456, 3256.14131046778, 2688.29554497405, 2913.20508057298), Cost_Transport = c(2133.20515513651, 2245.89817037301, 2485.40039786172, 2357.33319394193, 2163.11768000726, 2269.96431053028), Margin = c(987.164746914546, 524.294266829736, 777.879085232832, 898.808116525851, 525.17786496679, 643.2407700427), Count_Month_Export = structure(c(18109, 17744, 17805, 17683, 17591, 18078), class = "Date"), Count_Month_Import = structure(c(18140, 17775, 17836, 17744, 17652, 18109), class = "Date")), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))
    

    我使用的代码;错误出现在末尾:

    shipments_sample %>% 
      mutate(
        # flights %>% filter(between(month, 7, 9))
        DaysInMonths = if_else(
          (StartDate >= floor_date(proratamonth,"month") & StartDate < ceiling_date(proratamonth,"month")),
          as.numeric(ceiling_date(proratamonth,"month") - StartDate),
          if_else(
            (floor_date(proratamonth,"month") & EndDate < ceiling_date(proratamonth,"month")),
            as.numeric(ceiling_date(EndDate,"day") - floor_date(proratamonth,"month")),
            if_else(
              (StartDate < floor_date(proratamonth,"month") & EndDate >ceiling_date(proratamonth,"month")),
              as.numeric(ceiling_date(proratamonth,"month") - floor_date(proratamonth,"month")),
              as.numeric(0)
            )
          )
        ),
        # DaysInMonths = as.numeric(if(StartDate >= proratemonth){ceiling_date(proratemonth,"month") - StartDate}else{42}),
        Duration = as.numeric(EndDate - StartDate),
        PercentageInMonth = DaysInMonths/as.numeric(EndDate - StartDate),
        ProRata_Rev_Freight = Rev_Freight * PercentageInMonth,
        ProRata_Rev_Demurrage = PercentageInMonth * Rev_Demurrage,
        ProRata_Cost_Transport = PercentageInMonth * Cost_Transport
      )
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Jochem    7 年前

    在对卡米尔(用户:5325862)建议使用的问题的评论中 case_when 而不是nasted if语句。以下解决方案对我有效:

    shipments_sample %>% 
      mutate(
        # flights %>% filter(between(month, 7, 9))
        DaysInMonth = case_when(
          StartDate >= floor_date(proratamonth,"month") & StartDate < ceiling_date(proratamonth,"month") ~ as.numeric(ceiling_date(proratamonth,"month") - StartDate),
          EndDate >= floor_date(proratamonth,"month") & EndDate < ceiling_date(proratamonth,"month") ~ as.numeric(ceiling_date(EndDate,"day") - floor_date(proratamonth,"month")),
          StartDate < floor_date(proratamonth,"month") & EndDate >ceiling_date(proratamonth,"month") ~ as.numeric(ceiling_date(proratamonth,"month") - floor_date(proratamonth,"month")),
          TRUE ~ as.numeric(0)
        ),
        Duration = as.numeric(EndDate - StartDate),
        PercentageInMonth = DaysInMonth/as.numeric(EndDate - StartDate),
        ProRata_Rev_Freight = Rev_Freight * PercentageInMonth,
        ProRata_Rev_Demurrage = PercentageInMonth * Rev_Demurrage,
        ProRata_Cost_Transport = PercentageInMonth * Cost_Transport
      )