【发布时间】:2016-02-16 18:54:48
【问题描述】:
我有 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$metro 区域可以在d1$market 中找到时,我需要创建另一列d2$inmarket 为1,否则为0。我的目标是让d2 看起来像这样:
metro inmarket
1 Chicago 1
2 Meow 0
3 New York 1
我已经探索了 grep 和 sqldf 选项,但我没有看到任何回答我的问题。
This 会在匹配的地方返回d1 的索引,但我需要d2 的索引才能分配值1 或0。
我也可以使用sqldf 来选择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
【问题讨论】:
-
可以试试
library(data.table) ; setDT(d2)[, inmarket := +any(grepl(metro, d1$market, fixed = TRUE)), by = metro]之类的东西。 -
你可以试试
+(d2$metro %in% gsub(paste0('.*(', paste(d2$metro, collapse='|'), ').*'), '\\1', d1$market)) -
@DavidArenburg
fixed = TRUE是干什么用的?