如何在R中仅当COD_PROV匹配时创建工资差值新变量?
解决R中跨数据集匹配城市计算薪资差值的问题
问题背景
需要基于COD_PROV(城市编码)匹配两个数据集,仅对编码相同的记录计算Real wage的差值。直接使用mutate按行相减时,因两个数据集行数不匹配(dataset2缺失部分COD_PROV),出现如下错误:
Error in mutate():
ℹ In argument: Wage difference = ... - dataset1$Real wage.
Caused by error:
! Wage difference must be size 105 or 1, not 106.
Run rlang::last_error() to see where the error occurred.
数据集示例
dataset1:
COD_PROV Real wage 1 1962,18 6 1742,85 5 1541,81 96 1612,2 4 1574 3 1823,53 103 1584,49 2 1666,21 7 1747,81 10 2066,42 8 1498,01 11 1871,34 9 1770,41 15 2240,03 16 1729,17 17 1773,38 13 1832,57
dataset2(缺失部分COD_PROV):
COD_PROV Real wage 1 4962,18 6 1542,85 5 3541,81 4 1564 3 1223,53 2 1446,21 7 1557,81 10 2226,42 8 1458,01 11 1843,34 16 1439,17 17 1883,38 13 1992,57
解决方案
步骤1:转换薪资列格式
数据中的薪资用逗号作为小数点分隔符,需先转换为数值型才能计算:
# 将逗号替换为点,转换为数值 dataset1$`Real wage` <- as.numeric(gsub(",", ".", dataset1$`Real wage`)) dataset2$`Real wage` <- as.numeric(gsub(",", ".", dataset2$`Real wage`))
步骤2:匹配编码并计算差值
使用dplyr包的连接函数,确保仅相同COD_PROV的记录对应计算:
方式一:左连接(保留dataset1所有记录)
保留dataset1的全部数据,无匹配的记录差值设为NA:
library(dplyr) # 按COD_PROV左连接两个数据集,添加后缀区分原数据 combined_data <- left_join(dataset1, dataset2, by = "COD_PROV", suffix = c("_dataset1", "_dataset2")) # 计算薪资差值 combined_data <- mutate(combined_data, `Wage Difference` = `Real wage_dataset1` - `Real wage_dataset2`)
方式二:内连接(仅保留双方都存在的编码)
只保留两个数据集都有对应COD_PROV的记录:
library(dplyr) # 按COD_PROV内连接 combined_data <- inner_join(dataset1, dataset2, by = "COD_PROV", suffix = c("_dataset1", "_dataset2")) # 计算薪资差值 combined_data <- mutate(combined_data, `Wage Difference` = `Real wage_dataset1` - `Real wage_dataset2`)
错误原因说明
直接使用dataset1$Real wage - dataset2$Real wage是按**行位置**强行相减,完全不考虑COD_PROV是否匹配,且两个数据集行数不一致,导致R无法生成长度匹配的新变量,因此报错。使用连接函数可以确保记录按COD_PROV`正确匹配,避免行数不匹配的问题。
内容的提问来源于stack exchange,提问作者io_boh
相关产品推荐
相关产品推荐

