【发布时间】:2017-12-25 13:50:25
【问题描述】:
我有两个数据框。我想使用一个数据框中的元素来搜索另一个数据框中的一列。我需要通过匹配来缩小这个数据框的范围。然后继续逐个元素地缩小范围。查看示例代码,它可以更好地解释。
df1 col1
1 apples
2 oranges
3 apples
4 banana
5 grapes
6 mangoes
7 oranges
8 banana
df1 只有一列。同时 df2 有 2 列。 setID & col1
df2 setID col1
1 1 apples
2 1 oranges
3 1 oranges
4 1 mangoes
5 1 grapes
6 1 banana
7 1 banana
8 1 apples
10 2 apples
11 2 oranges
12 2 apples
13 2 banana
14 2 grapes
15 2 mangoes
16 2 banana
17 2 oranges
18 3 apples
19 3 banana
20 3 oranges
21 3 apples
22 3 grapes
23 3 mangoes
24 3 oranges
25 3 banana
26 4 apples
27 4 oranges
28 4 apples
29 4 grapes
30 4 grapes
31 4 oranges
32 4 banana
33 4 banana
如您所见,有一些重复的 setID。他们标记一组。集合的顺序很重要。请注意,df1$col1 不必与 df2 中的集合长度相同。它们也不必完全匹配。他们只需要足够接近即可。在这种情况下, df1$col1 最接近 df2$setID = 2 的匹配,只有最后两个元素乱序。它们不必完全匹配的原因是因为我想使用“键入时搜索”方法。我不想将 df1$col1 与 df2 上的 setID 匹配。我想通过逐个元素来缩小可能的集合。假设您一个一个地获取 df1 的元素,而不是一个完整的数据框。例如:
从 df2 中查找 df1$col1[1] 的匹配项,并将包含匹配项的所有集合保存到 tempdf。如果 df1$col1[1] 在同一个集合中多次找到匹配项,则无关紧要。如果至少找到一次,则该集合将被添加到 tempdf。
最后需要检索的是一个setID,它对应于匹配到df1的集合。在这种情况下,tempdf 将与 df2 相同,因为所有集合都包括“苹果”。鉴于第一个元素是匹配项,接下来将是 df1$col1[2] 与 tempdf 的匹配项。我猜 df1$col1[1:2] 来自 tempdf。这导致:
tempdf setID col1
1 1 apples
2 1 oranges
3 1 oranges
4 1 mangoes
5 1 grapes
6 1 banana
7 1 banana
8 1 apples
10 2 apples
11 2 oranges
12 2 apples
13 2 banana
14 2 grapes
15 2 mangoes
16 2 banana
17 2 oranges
26 4 apples
27 4 oranges
28 4 apples
29 4 grapes
30 4 grapes
31 4 oranges
32 4 banana
33 4 banana
基本上 setID = 3 被省略。随着 df1 中的第三个元素继续进行,新的 tempdf 将仅包含 setID 2 和 4。一旦只剩下一个 setID,循环(我想解决这个问题)就会结束,在这种情况下 setID = 2。因此 setID = 2 将是被认为是 df1 的紧密匹配。
当然,请随时就比这个更好的方法提出建议。
【问题讨论】:
-
lapply(split(df2[, "col1", drop = FALSE], df2$setID), function(x) identical(df1, x))? -
如果
df1的行数少于df2中的组,您的预期答案是什么?