如题,需要把好几个表中的31个省份做批量查找和替换,就是诸如安徽替换成安徽省北京替换成北京市,请坛友们帮忙看看有没有什么简便方法,谢谢啦

data <- data.table(
  area = c(
   '安徽',	'北京',	'福建',	'甘肃',	'广东',	'广西',
	'贵州',	'海南',	'河北',	'河南',	'黑龙江',	'湖北',
	'湖南',	'吉林',	'江苏',	'江西',	'辽宁',	'内蒙古',	
'宁夏',	'青海',	'山东',	'山西',	'陕西',	'上海',	'四川',
	'天津',	'西藏',	'新疆',	'云南',	'浙江',	'重庆'),
  value = c(1:31))

data <- data.table(
  area = c('安徽省',	'北京市',	'福建省',	'甘肃省',	'广东省',	'广西壮族自治区',	
'贵州省',	'海南省',	'河北省',	'河南省',	'黑龙江省',	'湖北省',	'湖南省',
	'吉林省',	'江苏省',	'江西省',	'辽宁省',	'内蒙古自治区',	'宁夏回族自治区',
	'青海省',	'山东省',	'山西省',	'陕西省',	'上海市',	'四川省',	'天津市',	
'西藏自治区',	'新疆维吾尔自治区',	'云南省',	'浙江省',	'重庆市'),
  value = c(1:31))

把映射关系定义出来,例如:

mr = data.frame(
  area = c("安徽", "北京", "新疆"),
  mt = c("安徽省", "北京市", "新疆维吾尔自治区")
)

然后利用 dplyr::left_join()datamr 关联起来。

或者data$area[data$area == "北京"] = "北京市"

另外一个解法使用plyr

library(plyr)
data$area <- mapvalues(data$area, from = c("安徽", "北京", "新疆"), to = c("安徽省", "北京市", "新疆维吾尔自治区"))
library(data.table)

dt <- data.table(
  area = c(
    "安徽", "北京", "福建", "甘肃", "广东", "广西",
    "贵州", "海南", "河北", "河南", "黑龙江", "湖北", "湖南",
    "吉林", "江苏", "江西", "辽宁", "内蒙古", "宁夏",
    "青海", "山东", "山西", "陕西", "上海", "四川", "天津",
    "西藏", "新疆", "云南", "浙江", "重庆"
  ),
  value = c(1:31)
)

mapping <- data.table(
  old = c(
    "安徽", "北京", "福建", "甘肃", "广东", "广西",
    "贵州", "海南", "河北", "河南", "黑龙江", "湖北", "湖南",
    "吉林", "江苏", "江西", "辽宁", "内蒙古", "宁夏",
    "青海", "山东", "山西", "陕西", "上海", "四川", "天津",
    "西藏", "新疆", "云南", "浙江", "重庆"
  ),
  new = c(
    "安徽省", "北京市", "福建省", "甘肃省", "广东省", "广西壮族自治区",
    "贵州省", "海南省", "河北省", "河南省", "黑龙江省", "湖北省", "湖南省",
    "吉林省", "江苏省", "江西省", "辽宁省", "内蒙古自治区", "宁夏回族自治区",
    "青海省", "山东省", "山西省", "陕西省", "上海市", "四川省", "天津市",
    "西藏自治区", "新疆维吾尔自治区", "云南省", "浙江省", "重庆市"
  )
)

dt[mapping, on = .(area = old), area := new]

dt[]
dt <- data.frame(
  area = c(
    "安徽", "北京", "福建", "甘肃", "广东", "广西",
    "贵州", "海南", "河北", "河南", "黑龙江", "湖北", "湖南",
    "吉林", "江苏", "江西", "辽宁", "内蒙古", "宁夏",
    "青海", "山东", "山西", "陕西", "上海", "四川", "天津",
    "西藏", "新疆", "云南", "浙江", "重庆",
    "西藏", "新疆", "云南", "浙江", "重庆"
  )
)

mapping <- data.frame(
  old = c(
    "安徽", "北京", "福建", "甘肃", "广东", "广西",
    "贵州", "海南", "河北", "河南", "黑龙江", "湖北", "湖南",
    "吉林", "江苏", "江西", "辽宁", "内蒙古", "宁夏",
    "青海", "山东", "山西", "陕西", "上海", "四川", "天津",
    "西藏", "新疆", "云南", "浙江", "重庆"
  ),
  new = c(
    "安徽省", "北京市", "福建省", "甘肃省", "广东省", "广西壮族自治区",
    "贵州省", "海南省", "河北省", "河南省", "黑龙江省", "湖北省", "湖南省",
    "吉林省", "江苏省", "江西省", "辽宁省", "内蒙古自治区", "宁夏回族自治区",
    "青海省", "山东省", "山西省", "陕西省", "上海市", "四川省", "天津市",
    "西藏自治区", "新疆维吾尔自治区", "云南省", "浙江省", "重庆市"
  )
)


mapping[match(dt$area, mapping$old), "new"]
  • ryo 觉得很赞
9 个月 后

推荐下 fuzzyjoin 包。

df1 = data.frame(
  area = c(
    "安徽", "北京", "福建", "甘肃", "广东", "广西",
    "贵州", "海南", "河北", "河南", "黑龙江", "湖北", "湖南",
    "吉林", "江苏", "江西", "辽宁", "内蒙古", "宁夏",
    "青海", "山东", "山西", "陕西", "上海", "四川", "天津",
    "西藏", "新疆", "云南", "浙江", "重庆"
  ),
  value = c(1:31)
)

df2 = data.frame(
  area = c(
    "吉林省", "江苏省", "江西省", "辽宁省", "内蒙古自治区", "宁夏回族自治区",
    "贵州省", "海南省", "河北省", "河南省", "黑龙江省", "湖北省", "湖南省",
    "青海省", "山东省", "山西省", "陕西省", "上海市", "四川省", "天津市",
    "安徽省", "北京市", "福建省", "甘肃省", "广东省", "广西壮族自治区",
    "西藏自治区", "新疆维吾尔自治区", "云南省", "浙江省", "重庆市"
  )
)

library(fuzzyjoin)
df1 |>
  stringdist_left_join(
    y = df2, 
    by = "area",
    max_dist = 0.3, 
    method = "jw"
  )

    Liechi 哈哈,还真是。这俩单词模糊匹配还真的有可能匹配到一起。