以“12 年”格式计算日期之间的差异
calculating difference between dates in "12 Years" format
我有一个如下所示的数据框
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)
我还想将数据框中的新列突变为 1,0 中的 T/F 以检查是否检查 hire_date 是否 > of 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, 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
这里是 df
中基于 OP 示例数据的数据。
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"))
我有一个如下所示的数据框
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)
我还想将数据框中的新列突变为 1,0 中的 T/F 以检查是否检查 hire_date 是否 > of 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, 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
这里是 df
中基于 OP 示例数据的数据。
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"))