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

时间:2018-07-01 13:58:12

标签: r dplyr

我尝试按比例将货运的持续时间分到发生的月份。为此,我在'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 个答案:

答案 0 :(得分:0)

在对问题camille(user:5325862)的注释中,建议使用case_when而不是插入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
  )