我有一个包含一组事务的 Dataframe df1
:
set.seed(99)
df1 <- tibble::tibble(
ID = 1:10,
Items = replicate(10, paste0('item-', sample(1:10, sample(3:5)[1]), collapse = ', '))
)
# # A tibble: 10 × 2
# ID Items
# <int> <chr>
# 1 1 item-6, item-5, item-3
# 2 2 item-6, item-4, item-9, item-7
# 3 3 item-6, item-4, item-5
# 4 4 item-1, item-7, item-2, item-9
# 5 5 item-5, item-8, item-7, item-2
# 6 6 item-10, item-1, item-6, item-4
# 7 7 item-6, item-7, item-9, item-4, item-5
# 8 8 item-6, item-9, item-1, item-3, item-5
# 9 9 item-6, item-8, item-7, item-3, item-9
# 10 10 item-4, item-7, item-5, item-9
我还有另一个查找表df2
,它指示获得优惠券的条件:
df2 <- tibble::tibble(
Items = c("item-4, item-6", "item-7, item-9"),
Coupons = c("coupon-1", "coupon-2")
)
# # A tibble: 2 × 2
# Items Coupons
# <chr> <chr>
# 1 item-4, item-6 coupon-1
# 2 item-7, item-9 coupon-2
这意味着,如果有人在一次交易中购买了"item-4"
和"item-6"
,他/她将获得"coupon-1"
。
我想合并df1
和df2
,这样我就可以知道一个事务是否满足了获取优惠券的任何条件。
# # A tibble: 12 × 3
# ID Items Coupons
# <int> <chr> <chr>
# 1 1 item-6, item-5, item-3 NA
# 2 2 item-6, item-4, item-9, item-7 coupon-1
# 3 2 item-6, item-4, item-9, item-7 coupon-2
# 4 3 item-6, item-4, item-5 coupon-1
# 5 4 item-1, item-7, item-2, item-9 coupon-2
# 6 5 item-5, item-8, item-7, item-2 NA
# 7 6 item-10, item-1, item-6, item-4 coupon-1
# 8 7 item-6, item-7, item-9, item-4, item-5 coupon-1
# 9 7 item-6, item-7, item-9, item-4, item-5 coupon-2
# 10 8 item-6, item-9, item-1, item-3, item-5 NA
# 11 9 item-6, item-8, item-7, item-3, item-9 coupon-2
# 12 10 item-4, item-7, item-5, item-9 coupon-2
事务ID
2和7重复,因为它们符合其项集中的所有条件。我已经尝试了merge()
和dplyr::left_join()
,但没有成功。希望有人能为这个问题提供一些线索。提前感谢!
4条答案
按热度按时间oipij1gg1#
使用
grepl
和merge
的 * 基本 * 选项(变体1)。代替使用
merge
子集化匹配(变体2)。另一变型(3)
另一个变体,仅在第一个字符串命中的情况下测试字符串(变体4)。
基准
结果
在本例中,变体4速度较快,变体3使用的内存量最低。
与其他方法比较。
结果
在这种情况下,GKi3和GKi4速度最快,使用的内存量最少。
wkyowqbh2#
您可以使用
fuzzyjoin
:您还可以使用
regex
前瞻检测:x一个一个一个一个x一个一个二个x
pobjuy323#
dplyr
的选项:输出:
或最新版本的
cross_join
(1.1.0
):gwo2fgha4#
一个
data.table
选项给予