使用R

时间:2017-01-20 03:33:36

标签: r dplyr plyr recode

我有两个数据框如下;

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()”函数的例子,我认为这些函数可用于在单个数据帧中重新编码值。但无法找到一种有效的方法来做我想做的事。

1 个答案:

答案 0 :(得分:1)

我们可以使用base R通过从'data1'创建键/值向量来填充'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