【发布时间】:2014-12-20 19:26:13
【问题描述】:
我有来自两个来源的数据集,它们代表同一组事件。并非所有的事件都存在于两个集合中,有些事件有多次发生,时间信息不一定同步。例如:考虑两个传感器,它们在 X、Y 中正确注册,但具有不同的灵敏度和响应特性,以及漂移时钟。
我可以执行数据帧的外连接并拆分出 complete.cases()。这会产生不匹配的事件和内部连接结果。由于两个集合中的多个事件在 X、Y 上发生碰撞,内连接结果可能非常大。我相信这被称为错误指定的连接,但它给出的结果我可以进一步过滤以匹配事件。
我尝试在键上获取 unique(),使用 subset() 提取并有条件地处理。如果子集的 nrows() 为 1,则它是假定匹配,如果 nrows() 大于 1,我会进行进一步处理以匹配我所能匹配的。我试过在键上做一个 split(),它更快,但它也有更大的数据集的问题。
使用 data.table 似乎可以加快速度,但速度并不快。但是,我确信我没有使用它的全部功能。在这一点上,我所做的只是指定键,这样就不需要为 merge() 重新生成它们。
以下是我想做的一些事情来加快速度:
- 提取不匹配的事件,以便我可以进行内部联接而不是外部联接。
- 在进行任何基于键的拆分/子集之前拆分所有单匹配事件。
- 以具有 .x 值和另一个 .y 值的向量或列表而不是 .x 和 .y 的所有可能组合的形式获取多重匹配事件。
这里是生成几个有代表性的数据帧的代码:
# 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
提前致谢。
【问题讨论】:
标签: r join split dataframe data.table