2017-04-13 177 views
-1

我对R相对较新,希望有人能为我回答这个问题。我在数据框proc_id,mco_id,start_date和end_date中有四列。 PLEASE CLICK ON THIS IMAGE TO SEE THE DATAFRAME. 这是我正在追求的逻辑。对于proc_id和mco_id的每个组合,如果start_date紧接在前面的end_date之后,那么proc_id和mco_id组合的最终数据框是最小开始日期和最大结束日期。计算日期差异

例如,前三行分别包含proc_id和mco_id的1234和ABC。数据帧第3行的开始日期是第2行结束日期后的一天,第2行的开始日期是第1行结束日期后的一天。因此,我的最终数据框proc_id和mco_id为1234, ABC必须有开始日期'2014-01-01'和结束日期'2014-07-01'。现在,如果proc_id和mco_id的组合的开始日期大于滞后结束日期的1天,则它们保持原样。最后,如果开始日期在滞后结束日期之前,那么类似于第一个实例,考虑proc_id和mco_id组合的最小开始日期和最大结束日期。所以,这是我期望的最终数据框。

This is the final data frame that I would like to get.

任何帮助将不胜感激。

+1

请不要张贴数据图片。请参阅[如何创建可重现的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example),以获取更好的将数据包括在问题本身中的方法的建议。 – MrFlick

回答

0

下面是与dplyr包一个快速的解决方案:

df %>% 
    group_by(proc_id, mco_id) %>% 
    summarise(start=min(start_date), end = max(end_date)) 

Source: local data frame [4 x 4] 
Groups: proc_id [?] 

    proc_id mco_id  start  end 
    <fctr> <fctr>  <date>  <date> 
1 1234 ABC 2014-01-01 2014-07-01 
2 2345 DEF 2014-06-01 2014-07-31 
3 3456 ABC 2015-01-01 2015-03-30 
4 4567 ABC 2015-04-15 2015-04-30 

df使用:

df <- structure(list(proc_id = structure(c(1L, 1L, 1L, 2L, 2L, 3L, 
3L, 4L), .Label = c("1234", "2345", "3456", "4567"), class = "factor"), 
mco_id = structure(c(1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L), .Label = c("ABC", 
"DEF"), class = "factor"), start_date = structure(c(16071, 
16161, 16191, 16222, 16252, 16436, 16478, 16540), class = "Date"), 
end_date = structure(c(16160, 16190, 16252, 16251, 16282, 
16495, 16524, 16555), class = "Date")), class = "data.frame", .Names = c("proc_id", 
"mco_id", "start_date", "end_date"), row.names = c(NA, -8L)) 

注:我会花更多的时间去抄写你的形象成可读的形式。今后请提供可再现的例子。