我有来自两个源的数据集,它们表示相同的事件集。并不是所有的事件都存在于这两个集合中,一些事件有多个发生,并且时间信息不一定是同步的。例如:考虑两个传感器,它们在X,Y中正确注册,但具有不同的灵敏度和响应特性,以及漂移时钟。
我可以执行数据帧的外部连接并拆分出complete.cases()。这将产生无法匹配的事件和内部连接结果。内连接结果可能非常大,因为在X,Y上碰撞的两个集合中都有多个事件。我相信这被称为一个指定错误的连接,但它给出的结果是我可以进一步过滤以匹配事件。
我尝试过在键上获得unique(),使用子集()进行提取并有条件地进行处理。如果子集的nrow()为1,则为推定匹配;如果nrow()大于1,则进行进一步处理以匹配所能匹配的内容。我尝试过对键进行拆分(),这样做速度更快,但也存在较大数据集的问题。
使用data.table似乎可以稍微加快速度,但不太快。然而,我确信我并没有使用它的全部功能。此时我所做的就是指定键,这样它们就不需要为merge()重新生成。
以下是我想要做的一些事情,以加快这一进程:
下面是生成几个具有代表性的数据帧的代码:
# Describe the basic frame
seedSize <- 7
keyCols <- c("x", "y")
noKeyCols <- c("time", "duration")
colSize <- length(keyCols) + length(noKeyCols)
frameSize <- seedSize * colSize
# Instantiate two with unique values
DF1 <- data.frame(matrix(1:frameSize, nrow=seedSize, ncol=colSize))
colnames(DF1) <- append(keyCols, noKeyCols)
DF2 <- DF1 + frameSize
# Duplicate a few from self and other and mangle no-key values
DF1 <- rbind(DF1, DF2[c(1:4, 1:3, 1, 6),])
DF1 <- rbind(DF1, DF1[c(1:5, 1:2),])
newRows <- (seedSize+1):nrow(DF1)
DF1[newRows, noKeyCols] <- DF1[newRows, noKeyCols] + newRows
DF2 <- rbind(DF2, DF1[c(1:4, 1:3, 1, 6),])
DF2 <- rbind(DF2, DF2[c(1:5, 1:2),])
newRows <- (seedSize+1):nrow(DF2)
DF2[newRows, noKeyCols] <- DF2[newRows, noKeyCols] + newRows
# Do some joins (sorting to make comparable)
DFI <- merge(DF1, DF2, by=keyCols)
DFI <- DFI[do.call(order, as.list(DFI),),]
row.names(DFI) <- NULL
DFO <- merge(DF1, DF2, by=keyCols, all=TRUE)
# Use complete.cases() to generate inner-join from outer
DFI2 <- DFO[complete.cases(DFO),]
row.names(DFI2) <- NULL提前谢谢。
发布于 2014-10-24 22:27:51
假设DT1和DT2是您的data.tables,我认为这就是您要寻找的(但不确定):
setkey(DT1, x, y)
DT1[DT2, nomatch=0L]如果您愿意,也可以将DT2的键设置为x,y。
https://stackoverflow.com/questions/26556699
复制相似问题