我对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组合的最终数据帧是最小开始日期和最大结束日期。
例如,前三行分别包含1234和ABC以及proc_id和mco_id。数据框第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.
非常感谢任何帮助。
答案 0 :(得分: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))
注意:我会花更多时间将您的图片转录为可读形式。请在将来提供可重复的示例。