使用 R 在两个数据帧中重新编码数据

Recode data in two dataframes using R

我有两个数据框如下;

data1 <- as.data.frame(matrix(0, ncol = 2, nrow = 5))
data1$V1 <- c("AA", "BB", "CC", "DD", "EE")
data1$V2 <- c(1, 2, 3, 4, 5)

> data1
   V1 V2
 1 AA  1
 2 BB  2
 3 CC  3
 4 DD  4
 5 EE  5

data2 <- as.data.frame(matrix(0, ncol = 2, nrow = 9))
data2$V1 <- c("AA", "AA", "AA", "BB", "BB","BB","CC","CC","DD")
data2$V2 <- c("BB", "CC", "EE", "CC", "DD","EE","DD","EE","EE")

> data2
  V1 V2
1 AA BB
2 AA CC
3 AA EE
4 BB CC
5 BB DD
6 BB EE
7 CC DD
8 CC EE
9 DD EE

我想根据数据帧“data1”的值重新编码 "data2" 数据帧中的所有值。预期结果如下;

> data3
 V1 V2
1  1  2
2  1  3
3  1  5
4  2  3
5  2  4
6  2  5
7  3  4
8  3  5
9  4  5

在我的真实数据集中 "data1" 数据框将有 100,000 个具有唯一值的行。

我找到了几个带有 "plyr" 包的示例,其中包含 "mapvalue()"、"revalue()" 函数,我认为这些示例可用于在单个数据框中重新编码值。但是找不到一个有效的方法来做我想做的事。

我们可以使用 base R 通过从 'data1' 创建一个 key/value 向量来填充 'data2'

中的值
data2[] <- setNames(data1$V2, data1$V1)[as.matrix(data2)]
data2
#  V1 V2
#1  1  2
#2  1  3
#3  1  5
#4  2  3
#5  2  4
#6  2  5
#7  3  4
#8  3  5
#9  4  5

或者我们可以使用 dplyrmatch

library(dplyr)
data2 %>% 
       mutate_each(funs(data1$V2[match(., data1$V1)]))
#   V1 V2
#1  1  2
#2  1  3
#3  1  5
#4  2  3
#5  2  4
#6  2  5
#7  3  4
#8  3  5
#9  4  5