根据正则表达式条件合并数据帧

时间:2017-07-26 16:07:27

标签: r regex dataframe

这个问题涉及R.我有两个数据帧,由这个最小可重现的例子表示:

a <- data.frame(geocode_selector = c("36005", "36047", "36061", "36081", "36085"), county_name = c("Bronx", "Kings", "New York", "Queens", "Richmond"))
b <- data.frame(geocode = c("360050002001002", "360850323001019"), jobs = c("4", "204"))

帮助传达我尝试执行的特定操作的示例:数据框geocode_selector中的a列包含纽约五个行政区的FIPS县代码。数据框geocode中的b列是特定人口普查区块的15位数ID。 geocode的前五位数与更一般的geocode_selector匹配,表示人口普查区所在的县。我想在b添加一列,指定每个人口普查区落在哪个县根据{{​​1}} geocode_selectorgeocode中的b匹配。

通常,我正在尝试根据正则表达式条件合并数据帧。理想情况下,我希望执行完整合并,将a的所有列都移至b,而不只是county_name

我尝试了以下几点:

b[, "county_name"] <- NA
for (i in 1:nrow(b)) {
  for (j in 1:nrow(a)) {.
    if (grepl(data.a$geocode_selector[j], b$geocode[i]) == TRUE) {
      b$county_name[i] <- a$county_name[j]
    }
  }
}

但我实际处理的大型数据集需要花费很长时间,而且最终产品不是我想要的。

非常感谢有关如何根据正则表达式条件有条件地合并数据帧的任何见解。

3 个答案:

答案 0 :(得分:2)

你可以这样做......

b$geocode_selector <- substr(b$geocode,1,5)
b2 <- merge(b, a, all.x=TRUE) #by default it will merge on common column names

b2
  geocode_selector         geocode jobs county_name
1            36005 360050002001002    4       Bronx
2            36085 360850323001019  204    Richmond

如果您愿意,可以使用geocode_selector

b2删除b2[,1] <- NULL

答案 1 :(得分:0)

我们可以使用confirm来创建&#39; geocode_selector&#39;然后进行连接

sub

答案 2 :(得分:0)

这是使用dplyr的绝佳机会。我也倾向于喜欢stringr中的字符串处理函数,例如UPDATE FIRSTTABLE SET SURNAME='THOMAS' WHERE ID IN (11, 21, 31)


str_sub