首页 > 解决方案 > 合并 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,但无法获得接近预期结果的任何地方。

标签: rregexmerge

解决方案


您需要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$

需要对列名等进行一些清理。


推荐阅读