按R中的行名对两个数据帧进行不精确合并

按R中的行名对两个数据帧进行不精确合并,r,merge,match,R,Merge,Match,我有两个数据帧:A有189行79列,和B有354行2列。它们的一些行名称大致如下所示: A: Sample value1 value2 value 3 10003 a b d 10003_Qi1 a a c 10003_Qi2 b a c 10017 b g c 10018

我有两个数据帧:
A
有189行79列,和
B
有354行2列。它们的一些行名称大致如下所示:

A:
Sample       value1     value2    value 3  
10003          a          b        d
10003_Qi1      a          a        c
10003_Qi2      b          a        c
10017          b          g        c
10018          b          f        s
10025_Qi       o          w        c
10040_Qi1      x          y        o
10040_ArT1     e          g        g
10125          p          g        m
10140_Ar1      w          n        c
10225          z          c        p

B:
Sample      first
10003       4
10004       8
10018       45
10025       85
10032       7
10040       54
10140       2
10132       8
10200       65
10324       9
10400       32
我希望根据两个数据帧行名称的不精确匹配来合并这两个数据帧,这将导致:

Sample     value1       value2    value 3    first
10003          a          b        d            4   
10018          b          f        s            45
10025_Qi       o          w        c            85
10040_Qi1      x          y        o            54
10140_Ar1      w          n        c            2
规则是:

  • 如果它们完全匹配,则为

  • 如果他们在前五个数字上匹配

    a<在
    A
    中的code>\u Qi1和
    \u Qi2
    中,
    B
    中的样本使用
    \u Qi1
    获取
    A
    中的样本值

    b
    \u Qi1
    \u ArT1
    A
    中,
    B
    中的样本获取
    A
    中的样本值,并与
    \u Qi1
    合并


  • 下面是我的麻烦解决方案:

    A<-data.frame(matrix(c(10003,"10003_q1","10007_q1",10008,1,2,3,2,4,3,1,2),4,3))
    colnames(A)<-c("sample","value1","value2")
    
    #     sample value1 value2
    # 1    10003      1      4
    # 2 10003_q1      2      3
    # 3 10007_q1      3      1
    # 4    10008      2      2
    
    B<-data.frame(matrix(c(10003,10004,10007,10009,4,8,45,85),4,2))
    colnames(B)<-c("sample","first")
    
    #   sample first
    # 1  10003     4
    # 2  10004     8
    # 3  10007    45
    # 4  10009    85
    
    # step 1: adapt both dataframes
    A$first<-NA
    A$sample2<-strtrim(A$sample,5)
    B$sample<-as.factor(B$sample)
    
    # step 2: work down table A merging values from table B
    # note: this assumes that B$sample is unqiue
    
    for(i in 1:NROW(A)){
      ind<-A$sample2[i]==B$sample
      if(sum(ind)!=0){ # makes sure a value was found
      A[i,"first"]<-B$first[ind]
      }
    }
    
    # step 3: remove any duplicates of A$sample2
    # note: this assumes that the 5 digit number will always come before the number+extension
    
    A<-A[!duplicated(A$sample2),]
    
    #      sample value1 value2 first sample2
    # 1     10003      1      4     4   10003
    # 3  10007_q1      3      1    45   10007
    # 4     10008      2      2    NA   10008
    

    a您想用哪种编程语言来实现这一点(可以猜r,但为了清楚起见,请添加标记)。另外,到目前为止,您自己尝试了什么来实现这一点?我尝试了agrep in循环,但它不起作用。但有一点:在规则2b中,我们需要扩展名为Q的样本值,但在这里,这些值是用a选择的。