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