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并没有产生预期的结果。谢谢你。
答案 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
。在stop
和start
日期中添加“ 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)
涉及dplyr
和lubridate
的一种可能性是:
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