减去月份/年份以获得年份

时间:2019-06-01 15:06:25

标签: r date

data = data.frame("start"= c("1/2000","8/2004","99/9999"),
                  "stop"=c("1/2001","2/2007","09/2010"),
                  "WANTYEARS"= c(1,2.5,NA))

我有月/年格式的日期,想减去以得到年份。

我尝试简单地执行data $ stop-data $ start并没有产生预期的结果。谢谢你。

3 个答案:

答案 0 :(得分:2)

yearmon类将月份和年份表示为年份和一年的分数。
使用末尾注释中显示的data

library(zoo)

transform(data, diff = as.yearmon(stop, "%m/%Y") - as.yearmon(start, "%m/%Y"))

给予:

    start    stop diff
1  1/2000  1/2001  1.0
2  8/2004  2/2007  2.5
3 99/9999 09/2010   NA

注意

data = data.frame(start= c("1/2000", "8/2004", "99/9999"),
                  stop = c("1/2001", "2/2007", "09/2010"))

答案 1 :(得分:1)

一个选择是从基数R中使用difftime。在stopstart日期中添加“ 01”以创建实际的Date对象,并使用difftime减去这些日期单位为"weeks",然后将其除以一年中的周数,得出一年中的时差,

round(difftime(as.Date(paste0("01/", data$stop), "%d/%m/%Y"), 
      as.Date(paste0("01/", data$start), "%d/%m/%Y"), units = "weeks")/52.2857, 2)

#[1] 1.0 2.5  NA

如果我们知道等效的年转换率,例如difftime,我们也可以使用"days"的任何其他单位组成来做同样的事情

round(difftime(as.Date(paste0("01/", data$stop), "%d/%m/%Y"), 
      as.Date(paste0("01/", data$start), "%d/%m/%Y"), units = "days")/365.25, 2)
#[1] 1.0 2.5  NA

答案 2 :(得分:1)

涉及dplyrlubridate的一种可能性是:

data %>%
 mutate_at(vars(1:2), list(~ parse_date_time(., "my"))) %>%
 mutate(WANTYEARS =  round(time_length(stop - start, "years"), 1))

       start       stop WANTYEARS
1 2000-01-01 2001-01-01       1.0
2 2004-08-01 2007-02-01       2.5
3       <NA> 2010-09-01        NA