2017-08-08 30 views
0

我們擁有數千萬行數據庫,其中可以在重疊期間實施相同的策略。R - 如何獲得不帶循環的重疊觀測數據的年份總數

我們有類似的東西:

Policy ID  Start Date End Date 
    A   01/01/2010 01/06/2010 
    A   01/01/2010 01/02/2010 
    A   01/03/2010 01/10/2010 

我們希望得到一個變量等於一年的總部分在此期間,政策的一項是「積極的」,但不包括重疊。我們可以創建一個新的變量,其中包括每個觀測值的年份。

Policy ID  Start Date  End Date  Portion of Year 
     A   01/01/2010 01/06/2010  5/12 
     A   01/01/2010 01/02/2010  1/12 
     A   01/03/2010 01/10/2010  7/12 

我們不能,但是,總結的時期,因爲它們有時重疊:結果將是13/12直接相加,而真正的結果應該是一年的對應01/01/2010部分-01/10/2010。如何得到沒有循環的結果?

我們想過使用月假人

謝謝!

+0

我前一個類似的問題。我也沒有,我沒有設法解決它沒有循環,對我來說是必要的。解決方案是計算每個組的時間段的獨特連續時間(在您的策略ID中)。有了這些,你可以計算id變量的活動週期。但它是一個循環的解決方案..你想避免。 –

回答

0

我們可以使用圖書館lubridate由我勸你看看aggregatemerge個月

library(lubridate) 
df$month <-interval(df$`Start Date`, df$`End Date`) %/% months(1) 

df$month <- df$month /12 

df 
0

的數量看兩個日期之間的差異。 以下鏈接是一個很好的aggregate example

一個簡單的例子可以是以下幾點:

# random data (two groups with random values) 
d = data.frame(x=sample(c("A", "B"), 10, TRUE), y=-rexp(10), z=rexp(10)); 

m = aggregate(y~x, d, min); # min of y for each group denoted by x 
M = aggregate(z~x, d, max); # max of z for each group denoted by x 

out = merge(m, M, by="x"); # merge the two data-sets (like SQL `join`) 
names(out) = c("x", "yMin", "zMax"); 
out[, "deltaT"] = out[, "zMax"] - out["yMin"]; 

# if you need to add the information to the original data, merge the output with the original dataset 
d2 = merge(d, tmp, by="x"); 
0

隨着dplyr,你可以計算出獨特的重疊期,lubridate::interval在個月的方式從@MFR計數的區別:

library("lubridate") 
library("dplyr") 

#replace spaces in column names with underscore for ease in manipulation 
colnames(DF) = gsub("\\s+","_",colnames(DF)) 


#compute minimum Start_Date and maximum End_Date for each Policy_ID 
#compute interval period in months using lubridate::interval functions 


newDF1 = DF %>% 
group_by(Policy_ID) %>% 
mutate(min_Start_Date = min(Start_Date), max_End_Date = max(End_Date), 
overLapMonths = interval(min_Start_Date, max_End_Date) %/% months(1)) %>% 
as.data.frame() 

newDF1 
# Policy_ID Start_Date End_Date min_Start_Date max_End_Date overLapMonths 
#1   A 2010-01-01 2010-06-01  2010-01-01 2010-10-01    9 
#2   A 2010-01-01 2010-02-01  2010-01-01 2010-10-01    9 
#3   A 2010-03-01 2010-10-01  2010-01-01 2010-10-01    9 


newDF2 = newDF1 %>% 
group_by(Policy_ID) %>% 
summarise(uniqOverLapMonths = unique(overLapMonths)) %>% 
as.data.frame() 

#  Policy_ID uniqOverLapMonths 
#1   A     9 
相關問題