如何在连续行中找不到连续的开始/结束日期

时间:2017-09-07 23:14:56

标签: r date dataframe

我没有看到类似于我需要的问题,所以我决定问。对不起,如果这是重复的话。

我有一个相当大的数据框(> 800k行),如下所示,我想创建一个所有行的数据框,其中开始日期是同一天或第二天作为上一个结束之一每个ID和组合的日期。

ID    Group    Start    End     V1
1     A        14688    14689   127
1     A        14690    14699   131
1     A        14690    14692   26
1     B        14690    14694   73
1     B        14694    14696   145
1     B        14695    14696   57
1     B        14670    14675   223

正如您所看到的,有多个行具有相同的开始日期或具有相同的结束日期,我无法使用shift()中的data.table函数来解决这个问题。包。我尝试了以下内容,但这只是查看前一行而不是上面那行。我不确定如何去看上一行(上面的2个,上面的3个,......,上面的20个等)。上表名为"输入。"

df.1 <- input[input$Start - shift(input$End, type = "lag") <= 1 & input$Start - shift(input$End, type = "lag") >= 0, ]

1 个答案:

答案 0 :(得分:0)

试一试

您的数据

df <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L), Group = c("A", 
"A", "A", "B", "B", "B", "B"), Start = c(14688L, 14690L, 14690L, 
14690L, 14694L, 14695L, 14670L), End = c(14689L, 14699L, 14692L, 
14694L, 14696L, 14696L, 14675L), V1 = c(127L, 131L, 26L, 73L, 
145L, 57L, 223L)), .Names = c("ID", "Group", "Start", "End", 
"V1"), row.names = c(NA, -7L), class = c("data.table", "data.frame"
))

功能

myfun <- function(df) {
             pairs <- combn(nrow(df), 2)
             df[unique(c(pairs[, apply(pairs, 2, function(x) diff(c(df$Start[x[2]], df$End[x[1]])) <= 1)])), ]
         }

功能说明

我使用combn来确定要比较的End日期和Start日期。

             [,1] [,2] [,3]
End     [1,]    1    1    2
Start   [2,]    2    3    3

将End [1]与Start [2],End [1]与Start [3]等进行比较。

然后我检查End-Start对和if <= 1之间的区别,然后保存这些索引。我使用unique(c(...来获取唯一的行索引。返回那些行。

溶液

splitdf <- split(df, list(df$ID, df$Group))
library(purrr)
map_df(splitdf, ~myfun(.x))

输出

  ID Group Start   End  V1
1  1     A 14688 14689 127
2  1     A 14690 14699 131
3  1     A 14690 14692  26
4  1     B 14690 14694  73
5  1     B 14694 14696 145
6  1     B 14695 14696  57

额外检查单观察组

你可以尝试

map_df(splitdf, ~if(nrow(.x) >1) { myfun(.x) })