根据不同数据帧中的值重新编码第二个数据帧中的值

Recoding values in second data frame based on values in a different data frame

我想根据不同数据框中的相应值重新编码第二个数据框中的值。

例如,这是第一个数据框的样子。每个代码都分配给相应的区域。

zone code
1 12345
2 23456
2 23457
2 23458
3 45678
3 45679

第二个数据框如下所示:

to_code fr_code
23456 12345
23457 23456
45678 23457
45678 23458
12345 45678
12345 23457

但我想根据相应的区域重新编码,所以它看起来像这样:

to_code from_code
2 1
2 2
3 2
3 2
1 3
1 2

我们可以使用match从'df1'中获取匹配的'code'的索引和df2中列的值并提取相应的'zone'

library(dplyr)
df3 <- df2 %>% 
   mutate(across(c(to_code, fr_code), ~ df1$zone[match(.x, df1$code)]))

或在base R

df3 <- df2

df3[c("to_code", "fr_code")] <- lapply(df3[c("to_code", "fr_code")],
      function(x) df1$zone[match(x, df1$code)])

-输出

df3
  to_code fr_code
1       2       1
2       2       2
3       3       2
4       3       2
5       1       3
6       1       2

数据

df1 <- structure(list(zone = c(1L, 2L, 2L, 2L, 3L, 3L), code = c(12345L, 
23456L, 23457L, 23458L, 45678L, 45679L)), class = "data.frame", row.names = c(NA, 
-6L))

df2 <- structure(list(to_code = c(23456L, 23457L, 45678L, 45678L, 12345L, 
12345L), fr_code = c(12345L, 23456L, 23457L, 23458L, 45678L, 
23457L)), class = "data.frame", row.names = c(NA, -6L))

我们可以使用 match

尝试以下基本 R 代码
> df2[] <- with(df1, zone[match(unlist(df2), code)])
> df2
  to_code fr_code
1       2       1
2       2       2
3       3       2
4       3       2
5       1       3
6       1       2