【问题标题】:Can dplyr join two data frames using a regular expression in by=?dplyr 可以在 by= 中使用正则表达式连接两个数据帧吗?
【发布时间】:2015-03-25 11:19:36
【问题描述】:

有没有办法使用 dplyr 的连接运算符连接两个数据帧,但使用正则表达式而不是直接 by=c('foo' = 'bar')?

类似:

people  <- data.frame(
     id = 1:10
   , emp = c("Caterpillar", "FEMA", "Community Hospital", "Gessert Grp.", "AT&T", "IBM Corp.", NA, "Smartguy Community College", NA, NA))



employers  <- data.frame(
     employerID     = c(1, 2, 3, 4, 5)
   , employerName   = c("Caterpillar Foundation", "Eli Lilly and Company Foundation Inc.", "Archer Daniels Midland Co", "IBM Corporation", "State Farm Co.  Foundation Matching Gifts")
   , employerRegexp = c("Caterpillar", "El *Lilly", "Archer *Daniels|ADM", "IBM", "State *Farm")
   )

peoplewRealEmployerNames  <- people  %>% 
     left_join(employers,by=c('emp' ~= 'employerRegexp')

显然,~= 不会真正起作用,但也许有类似的东西?

Dplyr 不是硬性要求,但它是我编写其余代码的风格,因此它是我的首选解决方案。

【问题讨论】:

  • 您可以在连接前使用类似grep 的正则表达式函数来获取要在连接中使用的列名,然后查看this Q&A 以了解如何使用字符向量作为 dplyr 连接的输入。
  • “雇主”的代码不运行。请编辑。
  • @docendo discimus ,这个常见问题解答值得单独为setNames() 支付入场费。我一直想知道是否有办法在一个月的管道中执行names(foo) &lt;- c("foo","bar","baz")!这样做会好很多:foo %&gt;% someFunction() %&gt;% setNames( c("foo","bar","baz") %&gt;% moreFunctions()
  • @crazybilly,很高兴知道。你认为我们可以把这个问题作为另一个问题的副本来结束吗?还是你想自己回答?

标签: regex r join dplyr


【解决方案1】:

fuzzyjoin 包正是这样做的,使用的语法与dplyr 大致相同。

因此,您只需将代码中的最后两行更改为:

library(fuzzyjoin)

peoplewRealEmployerNames <- people %>%
  regex_left_join(employers, by=c('emp' = 'employerRegexp'))

【讨论】:

  • 请注意,为清楚起见:如示例所示,正则表达式应位于右侧的 data_frame 中。左侧数据框中的列是要搜索的字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
  • 2010-09-29
相关资源
最近更新 更多