我有一个如下所示的数据框
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
答案 0 :(得分:0)
以下代码对我有用。而且您应该能够执行类似的操作。
# 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, unit = "weeks") / 52.25), 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"))