我在兩個不同的表(100萬行* 15; 3000 * 20)中可能會獲得更大的(1000萬行)多重匹配問題。對於大數據,在不同的行和列中進行多個匹配
我的解決方案可行,但我想盡可能快地考慮到我可能需要在更大的數據框中使用腳本。我正在使用r軟件包data.table。
考慮兩個例子的表,其中沒有行可以被刪除:
表1 - 的ToMach柱等於FALSE意味着相關聯的標籤不存在於表2,該步驟降低由兩個順序匹配到的大小執行:
set.seed(99)
table1 <- data.table(Tag = sample(paste0("tag_",1:3), 5, replace = T))
table1[ , ToMatch := ifelse(Tag == "tag_1", F, T)]
table1
Tag ToMatch
1: tag_2 TRUE
2: tag_1 FALSE
3: tag_3 TRUE
4: tag_3 TRUE
5: tag_2 TRUE
表2:
set.seed(99)
table2 <- data.table(center = sample(paste0("tag_",2:8), 5, replace = T),
north = sample(paste0("tag_",2:8), 5, replace = T),
south = sample(paste0("tag_",2:8), 5, replace = T))
> table2
center north south
1: tag_6 tag_8 tag_5
2: tag_2 tag_6 tag_5
3: tag_6 tag_4 tag_3
4: tag_8 tag_4 tag_6
5: tag_5 tag_3 tag_6
我的目標是找到表2表1哪裏的標籤被發現的行(可在以上各列的任何一列中)。我想輸出爲列表:
輸出:
Tag ToMatch output
1: tag_2 TRUE 2
2: tag_1 FALSE NA
3: tag_3 TRUE 3,5
4: tag_3 TRUE 3,5
5: tag_2 TRUE 2
我的解決辦法:
什麼表1的行是評估
match.index <- which(table1$ToMatch == T)
> match.index
[1] 1 3 4 5
池中的所有標籤從表2中維護排序。使用t
(tag_6 tag_8 tag_5 tag_2 tag_6 tag_5 ...
)
all.tags <- as.vector(t(table2))
> all.tags
[1] "tag_6" "tag_8" "tag_5" "tag_2" "tag_6" "tag_5" "tag_6"
[8] "tag_4" "tag_3" "tag_8" "tag_4" "tag_6" "tag_5" "tag_3"
[15] "tag_6"
預定義的空列表
list.results <- as.list(rep(as.numeric(NA), dim(table1)[1]))
循環:
for (i in 1:length(match.index)) {
list.results[[ match.index[i] ]] <- ceiling(
grep(table1[match.index[i], Tag], all.tags)
/3)
}
# dividing the index of all.tags found with grep by 3 (the original
# number of columns in table2) and rounding up to the closest integer
# (ceiling) return the index of the original table 2 where the tag
# is located
最終輸出:
> table1[ , output := list.results]
> table1
Tag ToMatch output
1: tag_2 TRUE 2
2: tag_1 FALSE NA
3: tag_3 TRUE 3,5
4: tag_3 TRUE 3,5
5: tag_2 TRUE 2
你有什麼建議,以加快這一代碼?
預先感謝您
任何好的理由,表1中的重複行?如果您對速度感興趣,那麼這種數據結構決策可能是一個減速帶。同樣,使用'melt(table2 [,r:= .I],「r」,value.name =「Tag」)可以更好地實現表格2的寬格式存儲...... – Frank
@Frank,上表是具有更多字段的較大表格的快照。在現實中,沒有行將被複制 –