微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 R 中涉及两年的时间段中提取一年

如何解决从 R 中涉及两年的时间段中提取一年

我需要提取与时间段对应的年份并将其放入数据框中的新列中。棘手的部分是我需要提取的年份不是日历年。我的“标准化”年份从给定日历年的 7 月 1 日开始,到下一个日历年的 6 月 30 日结束。因此,如果事件在此时间段内的任何时间发生,则标准化年份是该时间段内的第一个日历年,涉及两个日历年。例如,如果事件发生在 2019 年 7 月 1 日、2019 年 12 月 25 日和 2020 年 6 月 30 日,则所有这三个事件的“标准化”年份是 2019 年(即 7 月 1 日之间的时间段内的第一年) 2019 年和 2020 年 6 月 30 日)。如何在 R 中提取此类标准化年份并将其分配给数据框中的新列?

我的数据文件非常大,但作为一个简化的例子,这里有一些特定日期发生的事件

dat <- as.Date(c("2-Feb-18","24-May-10","30-Dec-19","1-Jul-20"),"%d-%b-%y")
dat <- as.data.frame(dat)
names(dat)[1] <- "events"
dat
      events
1 2018-02-02
2 2010-05-24
3 2019-12-30
4 2020-07-01

在这种情况下,我想创建“standardized_year”的列应该如下所示

      events standardized_year
1 2018-02-02              2017
2 2010-05-24              2009
3 2019-12-30              2019
4 2020-07-01              2020

在第一行中,标准化年份是 2017 年,因为 2-Feb-18 是在 2017 年 7 月 1 日和 2018 年 6 月 30 日之间,所以第一年是在“标准化”年份中提取的。所有其他值的标准相同。

有没有办法在 R 中为数据帧中的大量事件自动执行此操作?

任何帮助将不胜感激。谢谢

解决方法

您可以从前四个 substr 中提取实际年份,然后比较它是否小于从实际年份开始的标准化年份的 all 日期。我们从 sequences with ISOdate 得到的标准化年份。

standardized_year <- sapply(dat$events,function(x) {
  x <- as.POSIXct(x)
  y <- as.numeric(substr(x,1,4))
  ifelse(all(x < seq(ISOdate(y,7,0),ISOdate(y + 1,6,30,"day")),y - 1,y)
})
dat <- cbind(dat,standardized_year)
dat
#       events standardized_year
# 1 2018-02-02              2017
# 2 2010-05-24              2009
# 3 2019-12-30              2019
# 4 2020-07-01              2020
,

我想你可以做这样的事情:

library(dplyr)
library(lubridate)

events <- events %>% 
     mutate(events = dmy(events),standardized_year = ifelse(month(events)>=7,year(events),year(events)-1))
     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。