这个问题涉及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_selector
与geocode
中的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]
}
}
}
但我实际处理的大型数据集需要花费很长时间,而且最终产品不是我想要的。
非常感谢有关如何根据正则表达式条件有条件地合并数据帧的任何见解。
答案 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