我正在编写一个获取日期并输出(6月30日)会计年度月份的函数,其中7月是FY月1,8月是2,6月是12。
例如,给定两年的日期,我希望此数据的输出为c(1:12, 1:12)
:
data.frame(perf_dt = seq.Date(from = as.Date("2019-07-01"),
to = as.Date("2021-06-01"),
by = "month"))
我当前的功能是这个。它包括可选地允许输出标签的逻辑。
FY_mo <- function(date, label = F, abbrev = F) {
a <- (5 + (lubridate::month(date) %% 12)) + 1
CY_num = lubridate::month(date)
ifelse(!label, a,
ifelse(abbrev,
month.abb[CY_num],
month.name[CY_num]))
}
当我输入单个日期时,此方法有效。例如,此测试testthat
通过:
test_that("FY_mo works on indiv input dates", {
expect_equal(7, FY_mo(as.Date("2020-01-01")))
expect_equal("January", FY_mo(as.Date("2020-01-01"), label = TRUE))
expect_equal("Jan", FY_mo(as.Date("2020-01-01"), label = TRUE, abbrev = TRUE))
})
但是当我将其输入向量时,它不起作用。下面的代码输出所有“ 13”。
data.frame(perf_dt = seq.Date(from = as.Date("2019-07-01"),
to = as.Date("2021-06-01"),
by = "month")) %>%
dplyr::mutate(FY_mo = FY_mo(perf_dt)) %>%
dplyr::pull(FY_mo)
#[1] 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
我的错在哪里 有没有更好的方法来构造函数以产生正确的矢量输出?
这样并不是一个错误,但是由于我们正在ifelse
此处检查条件并ifelse
返回与相同长度的向量test
。由于我们test
的长度为1(length(!label)
),因此仅返回第一个值并对其进行回收。在这里,由于我们只有一个条件要检查,因此可以使用if
/else
代替,ifelse
这样可以避免此问题。
FY_mo <- function(date, label = F, abbrev = F) {
a <- match(lubridate::month(date), c(7:12, 1:6))
CY_num = lubridate::month(date)
if(!label) a
else if (abbrev) month.abb[CY_num]
else month.name[CY_num]
}
data.frame(perf_dt = seq.Date(from = as.Date("2019-07-01"),
to = as.Date("2021-06-01"),
by = "month")) %>%
dplyr::mutate(FY_mo = FY_mo(perf_dt)) %>%
dplyr::pull(FY_mo)
#[1] 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句