【问题标题】:Recode data in two dataframes using R使用 R 重新编码两个数据帧中的数据
【发布时间】:2017-01-20 03:33:36
【问题描述】:

我有两个数据框如下;

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 行具有唯一值的范围。

我发现了几个带有“mapvalue()”、“revalue()”函数的“plyr”包示例,我认为它们可用于对单个数据帧中的值进行重新编码。但无法找到一种有效的方法来做我想做的事。

【问题讨论】:

  • data2[] &lt;- lapply(data2, function(x){setNames(data1$V2, data1$V1)[x]}) 或使用 dplyr,data2 %&gt;% mutate_all(funs(setNames(data1$V2, data1$V1)[.]))
  • 感谢您的解决方案,它对我有用。

标签: r dplyr plyr recode


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    相关资源
    最近更新 更多