根据不同数据帧中的值重新编码第二个数据帧中的值
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
我想根据不同数据框中的相应值重新编码第二个数据框中的值。
例如,这是第一个数据框的样子。每个代码都分配给相应的区域。
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
> 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