问题描述
我有一个如下所示的数据框
Un_ID Type Child ID Name DOB Hire_date Tenure
1 AMF 23 ASD,ghu 31-12-2016 14-01-1996 2004
2 GHK 45 dgu,khl 2/6/2010 25-05-1989 1993
3 FGT 65 hhm,mjh 11/10/2016 19-12-1990 1998
4 MHU 76 aaa,scg 11/7/2016 19-10-1993 1998
我正在计算到今天的雇用日期之间的差额,但我正在以年为单位(2004年)得到答复,我希望是15年,20年
尝试如下
df$Tenure <- round(as.numeric(difftime(Sys.Date(),df$Hire_date,units = 'weeks')/52.25),0)
我也想将数据框中的新列更改为T / F(以1,0为单位),以检查是否hire_date是否为DOB + 20,但出现错误
Error in df$DOB + 17 : non-numeric argument to binary operator
df$Hire_check <- df$Hire_date>df$DOB+17
解决方法
以下代码对我有用。而且您应该能够执行类似的操作。
# Today is 2020-09-13
round(as.numeric(difftime(Sys.Date(),as.Date("2004-08-13"),units = "weeks") ) / 52.25,0)
[1] 16
但是,您的约会很混乱。 as.Date()
函数假定年份为第一,除非您为它提供了一种翻译格式,因此它将从2020年减去14!
lubridate
中的函数可以在执行此操作之前清除日期,并使其表现更好。然后,您可以对difftime()
使用类似的方法来确定您的hire_check
。
library(lubridate)
library(dplyr)
df %>%
mutate(DOB = dmy(DOB),Hire_date = dmy(Hire_date),Tenure = round(as.numeric(difftime(Sys.Date(),Hire_date,unit = "weeks") / 52.25),0 ),Hire_check = round(as.numeric(difftime(Hire_date,DOB,0 ) > 20)
# A tibble: 4 x 8
Un_ID Type Child_ID Name DOB Hire_date Tenure Hire_check
<dbl> <chr> <dbl> <chr> <date> <date> <dbl> <lgl>
1 1 AMF 23 ASD,ghu 2016-12-31 1996-01-14 25 FALSE
2 2 GHK 45 dgu,khl 2010-06-02 1989-05-25 31 FALSE
3 3 FGT 65 hhm,mjh 2016-10-11 1990-12-19 30 FALSE
4 4 MHU 76 aaa,scg 2016-07-11 1993-10-19 27 FALSE
这是基于OP的示例数据的df
中的数据。
df <- structure(list(Un_ID = c(1,2,3,4),Type = c("AMF","GHK","FGT","MHU"),Child_ID = c(23,45,65,76),Name = c("ASD,ghu","dgu,khl","hhm,mjh","aaa,scg"),DOB = c("31-12-2016","2/6/2010","11/10/2016","11/7/2016"),Hire_date = c("14-01-1996","25-05-1989","19-12-1990","19-10-1993")),row.names = c(NA,-4L),class = c("tbl_df","tbl","data.frame"))