繁体   English   中英

填充 R 中缺失的日期

[英]Filling missing dates in R

我想要一些关于分析所需的数据框转换的帮助。 我的数据由大量个人及其所有历史工作组成。 “EX”是代表终止雇佣原因的代码。 像这样的东西:

id  Date_start    Date_end       EX
13  "2001-02-01"  "2001-05-30"   A
13  "2002-03-01"  "2010-06-02"   B
14  ...           ...
...

所以我想做的是“填补空白”。 这可能并不容易,但更难,因为我希望它按 id 聚合,并且每个新行之前都应该具有该行的 EX 值,如下所示:

id  Date_start    Date_end       EX
13  "2001-02-01"  "2001-05-30"   A
13  "2001-05-31"  "2002-02-28"   A
13  "2002-03-01"  "2010-06-02"   B
14  ...           ...
...

我相信诀窍会是某种滞后和聚合,但我完全迷失了。

这有点棘手,您可以主要利用dplyr包进行操作和lubridate包来转换日期格式(您可以肯定使用as.Date() ,但lubridate使它更容易)。

library(dplyr)
library(lubridate)

1.创建您提供的示例数据。

names <- c("id", "Date_start",    "Date_end",       "EX")
row1 <- c(13 , "2001-02-01" , "2001-05-30" ,  "A")
row2 <- c(13 , "2002-03-01" , "2010-06-02" ,  "B")


testdata <- rbind(row1,row2) %>% data.frame(stringsAsFactors = F)
row.names(testdata) <- NULL

names(testdata) <- names

testdata$Date_start <- testdata$Date_start %>% as_date()
testdata$Date_end <- testdata$Date_end %>% as_date()
testdata

2.创建一个包含您要添加的数据的新数据集。

id :我们使用相同的 id 值,因为它是按 id 分组的。
Date_start :如果存在间隙,我们将使用一个值创建 Date_start ,否则为“”(空列,我们将它们过滤掉)。
Date_end :Date_end 的逻辑相同。
EX :我们使用您所说的倒数第二个 EX 值。

  new_data <- test_data %>% 
  group_by(id) %>% 
  mutate(Date_start1 = ifelse(Date_start-lag(Date_end) == 1,0,lag(Date_end)+1),
         Date_end1 = ifelse(Date_start-lag(Date_end) == 1,0,Date_start-1),
         EX=first(EX)) %>% 
  filter(!Date_start1 ==0) %>% 
  select(id, Date_start=Date_start1,Date_end=Date_end1,EX) %>% 
  distinct() %>% 
  ungroup()

3.由于我们想填补空缺天数,mutate把它变成了数值,我们使用as_date()将其转换成日期格式。

new_data$Date_start <- as_date(new_data$Date_start)
new_data$Date_end <- as_date(new_data$Date_end)

4.结合你的样本数据,按Date_state排列。

final <- rbind(testdata,new_data) %>% data.frame() %>% arrange(Date_start)
final

您的最终结果如下。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM