[英]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.