【问题标题】:Sending last day of month into a function in R将一个月的最后一天发送到 R 中的函数中
【发布时间】:2021-12-29 16:30:52
【问题描述】:

这可能不是一个很好的方法,但我必须在过去 4 年中每个月的最后一天运行到 functionrbind 的所有日期的输出到一个 data.frame .

我的环境中已经有我的数据框DF

我的功能

第 1 部分我需要在这里插入动态日期来自动循环日期。

myfunct <- function (date) {


abc <- subset(DF, HIRE_DATE <= date || LAST_WORKING_DATE <= date )
abc <- subset(abc, TDATE <= date)

augact <- abc %>% 
  group_by(ID_Merged) %>%
  slice(which.max(TDATE))


augact <- subset(augact, ASSIGNMENT_STATUS == "ACTIVE")

hc_cnt <- nrow(augact)
x <- data.frame(date, hc_cnt)

return(x)
}

第 2 部分

Row 将输出绑定为一个。

x <- myfunct("2021-01-31")
y <- myfunct("2021-08-31")
dfmerged <- rbind(x,y)

请记住我想自动发送每个月的最后一天。可能有一些包可以做到这一点。

rbind 输出我们如下

        date hc_cnt
1 2021-01-31   2946
2 2021-08-31   3039

【问题讨论】:

  • 你能分享一个你正在使用的数据的例子和一个你想要的输出的例子吗?
  • 不知道,数据太大了,我看看能不能做一个可重现的数据
  • @JuanBosco 我在这里添加了输出。
  • 您想要一份从固定日期到当前日期的所有月末的列表吗?
  • @ЕгорШишунов 是的,要输入到函数中,然后动态绑定行

标签: r function dplyr tidyverse


【解决方案1】:

我的意思是评论,但由于它确实是另一个答案,它应该是可见的......

要获取列出从日期start 到日期end 的每个月的最后一个日期的日期向量,仅使用基数 R,您可以这样做:

last_of_month <- function(start, end) {
  ## Round "YYYY-MM-DD" down to "YYYY-MM-01"
  start <- as.Date(format(start, "%Y-%m-01"))
  seq(start, end + 1, by = "1 month")[-1L] - 1
}

last_of_month(as.Date("2020-01-15"), as.Date("2021-11-18"))
#  [1] "2020-01-31" "2020-02-29" "2020-03-31" "2020-04-30" "2020-05-31"
#  [6] "2020-06-30" "2020-07-31" "2020-08-31" "2020-09-30" "2020-10-31"
# [11] "2020-11-30" "2020-12-31" "2021-01-31" "2021-02-28" "2021-03-31"
# [16] "2021-04-30" "2021-05-31" "2021-06-30" "2021-07-31" "2021-08-31"
# [21] "2021-09-30" "2021-10-31"

【讨论】:

  • 你能不能也看看日期是如何一一跑进函数并返回输出的?就目前而言,当我将日期的输出发送到函数时,它会选择第一个并将其全部粘贴。
  • 我不确定你的意思。在您提供数据框 DF 的样本之前,我无法测试您的功能,例如,通过复制和粘贴 dput(head(DF, 20)) 的输出。
  • 我的意思是,像 lapply(ends_of_months, myfunct) 这样的东西 - 它可以工作但返回多个列表,我希望它们理想地放入一个数据帧中。
  • 我明白了。试试do.call(rbind, lapply(ends_of_months, myfunct))
  • x &lt;- lapply(ends_of_months, myfunct) as.data.frame(do.call(rbind, x)) - 没关系,我想通了,谢谢你的基本解决方案
【解决方案2】:

也许我可以帮助你。您可以手动获取所有月末的列表:

library(data.table)

date_start <- as.Date("2020-01-01")
date_end <- Sys.Date()

all_dates <- .Date(date_start:date_end)
ends_of_months <- all_dates[which(month(all_dates) != month(lead(all_dates)))]

【讨论】:

  • 也有这种方法,只有一行和base R:seq(as.Date("2020-01-01"), Sys.Date() + 1, by = "1 month")[-1] - 1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 2017-01-07
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
相关资源
最近更新 更多