我没有看到类似于我需要的问题,所以我决定问。对不起,如果这是重复的话。
我有一个相当大的数据框(> 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, ]
答案 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) })