簡體   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