r - 将数据框中的值合并并替换为 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
请问,有人可以给我建议吗?谢谢。
解决方案
我们可以使用命名向量并匹配
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)]
推荐阅读
- amazon-web-services - 我们如何使用 saltstack 创建目录\文件夹用户 s3 存储桶
- python - 从用户输入中查找最小总和(不使用函数、lambda、map 等)
- yocto - 如何在 bitbake 中查找图像的配方文件顺序
- product - Magento 2中类别页面的分层导航中类别和属性过滤器的产品计数差异
- java - 带字符串的 switch 中需要的常量表达式
- sql - 如何为每个组生成汇总统计数据并转置?
- python - 打印 .triad_census() 会导致 TypeError
- javascript - JSDOC 注释格式
- javascript - 使用路由时表示不通过 req.params
- javascript - 检查跨域 iframe 内容(空白页)