首页 > 解决方案 > 将数据框中的值合并并替换为 R 中另一个数据框中的值

问题描述

我有两个数据帧:DF1 和 DF2,我想使用 DF2 中的值替换 DF1 中的值。

DF1:

> DF1 <- data.frame(V1=c("AA23", "AA34", "AA54", "BB32", "CC43", "DD32"), V2=c("BB32", NA,"CC43", NA, "DD32", "EE22"), V3=c("CC43", "DD32", NA, NA, "AA54", "EE54"))
> DF1
    V1   V2   V3
1 AA23 BB32 CC43
2 AA34 <NA> DD32
3 AA54 CC43 <NA>
4 BB32 <NA> <NA>
5 CC43 DD32 AA54
6 DD32 EE22 EE54

DF2:

    > DF2 <- data.frame(col1=c("AA23", "AA34", "AA54", "BB32", "CC43", "DD32", "EE22", "EE54", "EE55"), col2=c("a22", "a23", "a25", "a27", "b11", "b13", "b15", "c11", "c13"))
> DF2
  col1 col2
1 AA23  a22
2 AA34  a23
3 AA54  a25
4 BB32  a27
5 CC43  b11
6 DD32  b13
7 EE22  b15
8 EE54  c11
9 EE55  c13

我想将 DF1 中所有列的所有值(保留 NA)替换为 DF2$col2 中的值。

这是我的 DF_final:

    > DF_final
   V1   V2   V3
1 a22  a27  b11
2 a23 <NA>  b13
3 a25  b11 <NA>
4 a27 <NA> <NA>
5 b11  b13  a25
6 b13  b15  c11

请问,有人可以给我建议吗?谢谢。

标签: rdataframereplacemerge

解决方案


我们可以使用命名向量并匹配

library(data.table)
setDT(DF1)[, lapply(.SD, function(x) 
     setNames(as.character(DF2$col2), DF2$col1)[as.character(x)])]
#   V1   V2   V3
#1: a22  a27  b11
#2: a23 <NA>  b13
#3: a25  b11 <NA>
#4: a27 <NA> <NA>
#5: b11  b13  a25
#6: b13  b15  c11

或在base R

DF1[] <- lapply(DF1, function(x) 
     setNames(as.character(DF2$col2), DF2$col1)[as.character(x)])

或转换为 amatrix并进行匹配`

DF1[] <- setNames(as.character(DF2$col2), DF2$col1)[as.matrix(DF1)]

推荐阅读