【问题标题】:My output is not as per the code and I cannot identify where have I gone wrong我的输出与代码不符,我无法确定我哪里出错了
【发布时间】:2021-04-16 23:24:58
【问题描述】:

我使用 R 相对较新,我想使用“case when”语句为我的表创建一个名为 Reporting Month(格式:Date)的新列,条件是使用一个名为 Period(格式:Character)的列 执行的代码但日期的输出仅在 2020 年 1 月 1 日到 2020 年 12 月 31 日的范围内,2019 年或 2021 年没有,有人可以帮忙吗?如果有更简洁的方法可以做到这一点,我也非常感谢您的一些建议!非常感谢!!

dt <- dt %>%  mutate(
  Reporting_Month = case_when(
    Period == 'ZZZ-MARCH-2019' ~ as.Date("31/03/2019", format("%d/%m/%y")),
    Period == 'ZZZ-APRIL-2019' ~ as.Date("30/04/2019", format("%d/%m/%y")),
    Period == 'ZZZ-MAY-2019' ~ as.Date("31/05/2019", format("%d/%m/%y")),
    Period == 'ZZZ-JUNE-2019' ~ as.Date("30/06/2019", format("%d/%m/%y")),
    Period == 'ZZZ-JULY-2019' ~ as.Date("31/07/2019", format("%d/%m/%y")),
    Period == 'ZZZ-AUGUST-2019' ~ as.Date("31/08/2019", format("%d/%m/%y")),
    Period == 'ZZZ-SEPTEMBER-2019' ~ as.Date("30/09/2019", format("%d/%m/%y")),
    Period == 'ZZZ-OCTOBER-2019' ~ as.Date("31/10/2019", format("%d/%m/%y")),
    Period == 'ZZZ-NOVEMBER-2019' ~ as.Date("30/11/2019", format("%d/%m/%y")),
    Period == 'ZZZ-DECEMBER-2019' ~ as.Date("31/12/2019", format("%d/%m/%y")),
    Period == 'ZZZ-JANUARY-2020' ~ as.Date("31/01/2020", format("%d/%m/%y")),
    Period == 'ZZZ-FEBRUARY-2020' ~ as.Date("29/02/2020", format("%d/%m/%y")),
    Period == 'ZZZ-MARCH-2020' ~ as.Date("31/03/2020", format("%d/%m/%y")),
    Period == 'ZZZ-APRIL-2020' ~ as.Date("30/04/2020", format("%d/%m/%y")),
    Period == 'ZZZ-MAY-2020' ~ as.Date("31/05/2020", format("%d/%m/%y")),
    Period == 'ZZZ-JUNE-2020' ~ as.Date("30/06/2020", format("%d/%m/%y")),
    Period == 'ZZZ-JULY-2020' ~ as.Date("31/07/2020", format("%d/%m/%y")),
    Period == 'ZZZ-AUGUST-2020' ~ as.Date("31/08/2020", format("%d/%m/%y")),
    Period == 'ZZZ-SEPTEMBER-2020' ~ as.Date("30/09/2020", format("%d/%m/%y")),
    Period == 'ZZZ-OCTOBER-2020' ~ as.Date("31/10/2020", format("%d/%m/%y")),
    Period == 'ZZZ-NOVEMBER-2020' ~ as.Date("30/11/2020", format("%d/%m/%y")),
    Period == 'ZZZ-DECEMBER-2020' ~ as.Date("31/12/2020", format("%d/%m/%y")),
    Period == 'ZZZ-JANUARY-2021' ~ as.Date("31/01/2021", format("%d/%m/%y")),
    TRUE                      ~  as.Date("31/01/2000")
  )
)

【问题讨论】:

  • 使用'lubridate::ceiling_date`,事情会容易得多
  • 如果您创建一个小的可重现示例以及预期的输出,这将更容易提供帮助。阅读how to give a reproducible example

标签: r dplyr case-when


【解决方案1】:

您可以将 Period 更改为 yearmon 类,然后更改为 Date with frac = 1 以获取该月的最后一天。

library(dplyr)
library(zoo)

dt %>% mutate(Reporting_Month = as.Date(as.yearmon(Period,'ZZZ-%b-%Y'),frac = 1))

#             Period Reporting_Month
#1    ZZZ-MARCH-2019      2019-03-31
#2     ZZZ-JUNE-2019      2019-06-30
#3  ZZZ-OCTOBER-2019      2019-10-31
#4 ZZZ-DECEMBER-2019      2019-12-31

数据

dt <- data.frame(Period = c('ZZZ-MARCH-2019', 'ZZZ-JUNE-2019', 
                            'ZZZ-OCTOBER-2019', 'ZZZ-DECEMBER-2019'))

【讨论】:

  • 感谢 Ronak,它仅在控制台上显示时才有效,但当我尝试变异并作为列添加到数据框时,日期格式的 Reporing_Month 为 NA.... :(
  • @SL22122406 您需要将数据分配回dt。尝试dt &lt;- dt %&gt;% mutate(Reporting_Month = as.Date(as.yearmon(Period,'ZZZ-%b-%Y'),frac = 1))Reporting_Month 视为原始数据中的新列。
  • 嗨 Ronak,我确实使用上面的行创建了一个新列,但由于某种原因,它不起作用,新列都返回为 NA,原因很奇怪。也非常感谢您的帮助,现在已排序:)
  • 我认为使用%B 而不是%b 应该可以。 dt &lt;- dt %&gt;% mutate(Reporting_Month = as.Date(as.yearmon(Period,'ZZZ-%B-%Y'),frac = 1))。不过很奇怪,%b 为我工作。
【解决方案2】:
library(lubridate) 

dt %>%  mutate(
  Reporting_Month = ceiling_date(dmy(str_replace(Period, 'ZZZ', '01')), unit = 'month') - days(1))
             Period Reporting_Month
1    ZZZ-APRIL-2019      2019-04-30
2  ZZZ-OCTOBER-2019      2019-10-31
3     ZZZ-JULY-2020      2020-07-31
4 ZZZ-DECEMBER-2021      2021-12-31
5  ZZZ-JANUARY-2021      2021-01-31

一个虚拟的例子

dt
> dt
             Period
1    ZZZ-APRIL-2019
2  ZZZ-OCTOBER-2019
3     ZZZ-JULY-2020
4 ZZZ-DECEMBER-2021
5  ZZZ-JANUARY-2021

【讨论】:

  • 感谢 AnilGoyal,我也尝试使用您的代码,但出现错误错误 UseMethod("mutate") : no applicable method for 'mutate' applied to an object of class "function"
  • 你加载了dplyr。我没有指定,因为那是你的标签
  • 是的,我已经用属于:library(tidyverse) library(readxl) library(dplyr) library(xlsx) library(zoo) library(lubridate) 加载了很长的 dplyr,当我测试它时结果现在是 NA。 tESTp &lt;- tESTp %&gt;% mutate(Reporting_Month = as.Date(as.yearmon(Period,'ZZZ-%b-%Y'),frac = 1))
  • 抱歉,AnilGoyal,你的确实有效!非常感谢您的帮助:)
最近更新 更多