从几个现有变量创建一个新的日期变量

时间:2019-07-10 04:19:48

标签: r lubridate

对于以下数据集(大数据集的一小部分),我想创建一个名为“ DATE”的变量,它将使用变量“ fyr”和“ fyearq”中的信息。实际上,变量“ fyr”表示月份-例如5表示5月,10表示10月。变量“ fyearq”表示与该月相对应的年份。现在,新变量“ DATE”将类似于(第一次观察)1968-5-31,这意味着除了使用两个变量“ fyr”和“ fyearq”中的数据外,还将添加该变量的LAST DAY相应的月份。基本上,我要创建变量,因为最终使用“ DATE”变量和“ rdq”变量,我将创建另一个名为“ DIFF”的变量,它实际上是这两个日期变量之间的天数(变量“ DATE”和“变量“ rdq”)。我知道lubridate软件包非常适合处理日期问题,但不确定如何使用。

a = 1
b = 1

print(a is b)
#Output: True

c = 1.23
d = 1.23
print(c is d)
#Output: False

2 个答案:

答案 0 :(得分:1)

在这种情况下,基数R应该足够。我们可以递增fyr,然后将其包装在as.Date中,以获取下个月的第一个日期,然后减去-1以获取当前月的最后一个日期。

as.Date(paste(df$fyearq, df$fyr + 1, "01"), "%Y %m %d") - 1
#[1] "1968-05-31" "1969-05-31" "1970-05-31" "1971-05-31" "1972-05-31"....

如果您不想明确指定格式,则可以使用具有相同逻辑的lubridate

lubridate::ymd(paste(df$fyearq, df$fyr  + 1, "01")) - 1

@thelatemail的评论启发了答案的逻辑。

答案 1 :(得分:0)

我们可以将base R方法与sprintf一起使用

as.Date(do.call(sprintf, c(fmt = "%d-%d-01",
            df[c('fyearq', 'fyr')] + list(0, 1)))) -1
#[1] "1968-05-31" "1969-05-31" "1970-05-31" "1971-05-31" "1972-05-31"  ...

数据

df <- structure(list(fyr = c(5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 10L, 10L, 10L, 10L, 10L, 10L, 
10L, 10L, 10L, 10L, 10L, 10L, 10L), fyearq = c(1968L, 1969L, 
1970L, 1971L, 1972L, 1973L, 1974L, 1975L, 1976L, 1977L, 1978L, 
1979L, 1980L, 1981L, 1982L, 1983L, 1984L, 1985L, 1986L, 1987L, 
1988L, 1989L, 1990L, 1991L, 1992L, 1993L, 1994L, 1995L, 1996L, 
1997L, 1998L, 1999L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 
2006L, 2007L, 2008L, 2009L, 2010L, 2011L, 2012L, 2013L, 2016L, 
2014L, 2015L, 2017L, 1982L, 1983L, 1984L, 1985L, 1986L, 1987L, 
1988L, 1989L, 1990L, 1991L, 1992L, 1993L, 1994L), tic = c("AIR", 
"AIR", "AIR", "AIR", "AIR", "AIR", "AIR", "AIR", "AIR", "AIR", 
"AIR", "AIR", "AIR", "AIR", "AIR", "AIR", "AIR", "AIR", "AIR", 
"AIR", "AIR", "AIR", "AIR", "AIR", "AIR", "AIR", "AIR", "AIR", 
"AIR", "AIR", "AIR", "AIR", "AIR", "AIR", "AIR", "AIR", "AIR", 
"AIR", "AIR", "AIR", "AIR", "AIR", "AIR", "AIR", "AIR", "AIR", 
"AIR", "AIR", "AIR", "AIR", "ABSI", "ABSI", "ABSI", "ABSI", "ABSI", 
"ABSI", "ABSI", "ABSI", "ABSI", "ABSI", "ABSI", "ABSI", "ABSI"
), rdq = c(NA, NA, NA, NA, "1973-07-23", "1974-07-06", "1975-07-18", 
"1976-07-15", "1977-07-20", "1978-06-29", "1979-07-16", "1980-07-14", 
"1981-07-20", "1982-07-22", "1983-07-28", "1984-07-26", "1985-07-24", 
"1986-07-08", "1987-07-14", "1988-07-20", "1989-07-18", "1990-06-20", 
"1991-06-20", "1992-06-19", "1993-07-14", "1994-07-06", "1995-07-06", 
"1996-07-01", "1997-06-25", "1998-06-25", "1999-06-24", "2000-06-28", 
"2001-06-28", "2002-08-26", "2003-07-03", "2004-06-29", "2005-07-13", 
"2006-07-12", "2007-07-11", "2008-07-09", "2009-07-14", "2010-07-13", 
"2011-07-06", "2012-07-17", "2013-07-25", "2014-07-15", "2017-07-11", 
"2015-07-13", "2016-07-12", "2018-07-10", NA, NA, "1984-12-20", 
"<NA>", "1986-11-18", NA, "1988-11-22", "1989-11-22", "1990-11-29", 
"1991-11-21", "1992-11-30", "1993-11-26", "1994-11-29")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", 
"25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", 
"36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", 
"47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", 
"58", "59", "60", "61", "62", "63"))