【发布时间】:2018-08-21 06:20:21
【问题描述】:
这个问题之前可能已经被问过,但如果可能的话,我正在寻找一个 data.table 解决方案,而不使用其他包。我有一个 data.table DT1 作为参考:
> require(data.table)
> DT1 <- data.table(col1 = c("AA", "BA", "ABC", "ABC BC", "AB")
, col2 = c(1,4,5,3,2))
> DT1
col1 col2
1: AA 1
2: BA 4
3: ABC 5
4: ABC BC 3
5: AB 2
我想根据 DT1 中的 col1 和 DT2 中的 col2 的部分匹配,将第二个 data.table DT2 与 DT1 合并,在 DT2 中创建一个 col3。
> DT2 <- data.table(col1 = c(0,5,2,7,1,0)
, col2 = c("BA", "ABC", "DC", "AA", "AB", "R AB"))
> DT2
col1 col2
1: 0 BA
2: 5 ABC
3: 2 DC
4: 7 AA
5: 1 AB
6: 0 R AB
想要的输出
> desired_output <- data.table(col1 = c(0,5,5,2,7,1,1,1,0)
, col2 = c("BA", "ABC", "ABC", "DC", "AA", "AB", "AB", "AB", "R AB")
, col3 = c(4,5,3,NA,1,5,3,2,2))
> desired_output
col1 col2 col3
1: 0 BA 4
2: 5 ABC 5
3: 5 ABC 3
4: 2 DC NA
5: 7 AA 1
6: 1 AB 5
7: 1 AB 3
8: 1 AB 2
9: 0 R AB 2
是否有任何优雅的方法可以使用 data.table 操作来做到这一点?如果不是那么乐意考虑其他解决方案。这将在一个非常大的数据集上运行。
编辑:指定部分匹配的条件,如果 DT1 中的 col1 字符串是 DT2 中 col2 字符串的子集,则匹配(DT2 中 col2 的字符串是字符串的子集) DT1 中的 col1)。两种方式的 grepl?
col1/DT1 col2/DT2
"AB" "There is ABhere" # it's a match
"ABC" "someABC" # it's a match
"ABC BC" "ABC" # it's a reverse match
"DR" "ADD" # no match
"BA" "HABAHA" # two matches
【问题讨论】:
-
一个data.table就是一个data.frame。那么,为什么不使用 data.frame 呢? stackoverflow.com/questions/18001120/… 因为要制作 data.table 你需要一个额外的包:stackoverflow.com/questions/28513319/…
-
因为它是一个非常大的数据集并且数据框合并操作非常缓慢
-
嗯。这是相关的,但不是完全相同的问题。
-
在加入 DT2 之前在 DT1 的 col1 中按空格分割是否适用于您的数据集?
标签: r merge data.table matching partial