r - 合并 2 个数据框,df1 中多个位置的占位符,df2 中填充的占位符
问题描述
我有两个数据框;( DF 1 ) 具有两个变量的行,这些变量在字符串的不同位置具有“通配符”以及没有“通配符”的变量,并且 ( DF 2 ) 具有多行,其中的变量来自 DF 1 但“通配符”填写。
东风1
Wild_Cards<-data.frame(Var=c("Var A[*]","Var B[*, X1]","Var C[X2, *]","Var D[*, *]", "Var E"),A=c(1,0.5,0.8,0,-1),B=c(2,1.5,1.8,1,0))
Var A B
1 Var A[*] 1.0 2.0
2 Var B[*, X1] 0.5 1.5
3 Var C[X2, *] 0.8 1.8
4 Var D[*, *] 0.0 1.0
5 Var E -1.0 0.0
东风2
Values<-data.frame(Var=c("Var A[Y]","Var A[Z]","Var B[Y, X1]","Var B[Z, X1]","Var C[X2, Y]", "Var C[X2, Z]","Var D[A, Y]","Var D[B, Z]", "Var E"), D=c(1.5,1.8,1,1.4,1,1,0,0.5,-0.5))
Var D
1 Var A[Y] 1.5
2 Var A[Z] 1.8
3 Var B[Y, X1] 1.0
4 Var B[Z, X1] 1.4
5 Var C[X2, Y] 1.0
6 Var C[X2, Z] 1.0
7 Var D[A, Y] 0.0
8 Var D[B, Z] 0.5
9 Var E -0.5
我需要组合这些数据框,以便通过将 DF 1 的变量名称与通配符匹配到 DF 2 的变量名称来合并相关值A
和值。B
重要的是最终结果保持变量名格式。
期望的输出
Result<-data.frame(Var=c("Var A[Y]","Var A[Z]","Var B[Y, X1]","Var B[Z, X1]","Var C[X2, Y]", "Var C[X2, Z]","Var D[A, Y]","Var D[B, Z]", "Var E"), D=c(1.5,1.8,1,1.4,1,1,0,0.5,-0.5),A=c(1,1,0.5,0.5,0.8,0.8,0,0,-1),B=c(2,2,1.5,1.5,1.8,1.8,1,1,0))
Var D A B
1 Var A[Y] 1.5 1.0 2.0
2 Var A[Z] 1.8 1.0 2.0
3 Var B[Y, X1] 1.0 0.5 1.5
4 Var B[Z, X1] 1.4 0.5 1.5
5 Var C[X2, Y] 1.0 0.8 1.8
6 Var C[X2, Z] 1.0 0.8 1.8
7 Var D[A, Y] 0.0 0.0 1.0
8 Var D[B, Z] 0.5 0.0 1.0
9 Var E -0.5 -1.0 0.0
我试图将其分解并使用stringr
fuzzyjoin
's以小步骤完成它regex_join
,但无法获得接近预期结果的任何地方。
解决方案
您需要utils::glob2rz
和的组合fuzzyjoin::regex_*_join
:
fuzzyjoin::regex_*_join
需要真正的正则表达式模式,但您的模式似乎更像是“glob”风格的通配符。幸运的是,我们可以在基础 R 中轻松地将后者转换为前者:
glob2rx(Wild_Cards$Var)
# [1] "^Var A\\[.*]$" "^Var B\\[.*, X1]$" "^Var C\\[X2, .*]$" "^Var D\\[.*, .*]$" "^Var E$"
Wild_Cards$ptn <- glob2rx(Wild_Cards$Var)
从这里开始,它只是一个正则表达式连接:
fuzzyjoin::regex_right_join(Values, Wild_Cards, by = c(Var = "ptn"))
# Var.x D Var.y A B ptn
# 1 Var A[Y] 1.5 Var A[*] 1.0 2.0 ^Var A\\[.*]$
# 2 Var A[Z] 1.8 Var A[*] 1.0 2.0 ^Var A\\[.*]$
# 3 Var B[Y, X1] 1.0 Var B[*, X1] 0.5 1.5 ^Var B\\[.*, X1]$
# 4 Var B[Z, X1] 1.4 Var B[*, X1] 0.5 1.5 ^Var B\\[.*, X1]$
# 5 Var C[X2, Y] 1.0 Var C[X2, *] 0.8 1.8 ^Var C\\[X2, .*]$
# 6 Var C[X2, Z] 1.0 Var C[X2, *] 0.8 1.8 ^Var C\\[X2, .*]$
# 7 Var D[A, Y] 0.0 Var D[*, *] 0.0 1.0 ^Var D\\[.*, .*]$
# 8 Var D[B, Z] 0.5 Var D[*, *] 0.0 1.0 ^Var D\\[.*, .*]$
# 9 Var E -0.5 Var E -1.0 0.0 ^Var E$
需要对列名等进行一些清理。
推荐阅读
- keras - 使用自定义损失函数在 keras 顺序模型上编译错误
- sql - 在 SNOWFLAKE 的另一个表中使用一列的值作为标识符
- vue.js - 在计算中返回一个 getter 创建一个循环
- azure - AD B2C 直接登录显示 {OIDC:LoginHint} 而不是电子邮件地址
- matlab - 简化涉及查找数组最大元素位置的 Matlab 代码
- html - Div 高度与仅在 IE11 中的属性上声明的不同
- python - 如何创建将在今天或明天起作用的 Python“警报”
- google-apps-script - 超过一万行的 TextFinder 实例的 findNext 上的服务错误
- rest - REST URI 设计:具有复数名称的资源
- c++ - 为什么我可以将 `std::string` 右值存储到 `const std::string &`