使用 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
或者我们可以使用 dplyr
和 match
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
我有两个数据框如下;
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
或者我们可以使用 dplyr
和 match
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