有条件地将基于部分匹配的列值分配给向量中的至少 1 个元素

Conditionally assign column value based on partial match to at least 1 element in vector

我有2个数据框

market<-c('New York, NY','Some place in Chicago','Lala land')
d1<-as.data.frame(market)
metro<-c('Chicago','Meow','New York')
d2<-as.data.frame(metro)

我需要创建另一列 d2$inmarket,当 d2$metro 区域可以在 d1$market 中找到时,该列为 1,否则为 0。我的目标是让 d2 看起来像这样:

     metro inmarket
1  Chicago        1
2     Meow        0
3 New York        1

我已经探索了 grepsqldf 选项,但我没有看到任何答案回答我的问题。

This 将 return d1 的索引匹配,但我需要 d2 的索引才能分配值 1 或 0。

我也可以使用 sqldf 到 select d1 中匹配的行,但我不能反过来,因为我不能显然,在 d2$metro 中搜索 d1$market

d1$market<-as.character(d1$market)
d2$metro<-as.character(d2$metro)
find<-function(x){fn$sqldf("select market from d1 where market like '%$x%'")}
p<-d2$metro
m<-lapply(p,function(y) find(y))
data.frame(matrix(unlist(m)))
    1 Some place in Chicago
    2 New York, NY

有什么想法吗?

编辑:这适用于一个元素,但我需要循环:

d2$inmarket[grepl('Chicago', d1$market)] <- 1

一个选项是在 'd1' 中对 'market' 列进行子字符串化并使用 %in%

d2$inmarket <- +(d2$metro %in% gsub(paste0('.*(', paste(d2$metro, 
        collapse='|'), ').*'), '\1', d1$market))
d2
#     metro inmarket
#1  Chicago        1
#2     Meow        0
#3 New York        1