关于r:在多列上交叉数据框

Intersect dataframe on multiple columns

本问题已经有最佳答案,请猛点这里访问。

我有两个数据帧:

日期:1900 OBS,共9个变量

1
2
3
4
5
6
              V1        V2        V3        V4 V5      V6       V7     V8             V9
1        V_P50P50_Q3 chr12 106642383 106642395  + 18.1425 4.03e-08 0.0515  GGGGGACTCCCCC
2 V_P50RELAP65_Q5_01  chr8 142276666 142276677  - 16.6429 2.51e-07 0.2780   GGGATTTCCCAC
3          V_RELA_Q6 chr22  51020067  51020078  - 15.9395 2.71e-07 0.3350   GGGAATTTCCCC
4       V_NFKB_Q6_01 chr14  98601454  98601469  + 17.0684 3.08e-07 0.236  GGAGTGGAAATTCC
5          V_CREL_Q6 chr22  51020068  51020079  - 16.1165 3.19e-07 0.4050   AGGGAATTTCCC

dat.markov:1486 obs,共9个变量

1
2
3
4
5
6
            V1    V2        V3        V4 V5      V6       V7    V8               V9
1 V_NFKB_Q6_01 chr14  98601454  98601469  + 17.2212 1.33e-07 0.146 GGAGTGGAAATTCCCT
2  V_P50P50_Q3 chr12 106642383 106642395  + 16.9358 1.57e-07 0.201    GGGGGACTCCCCC
3    V_CREL_Q6 chr22  51020068  51020079  - 16.0549 2.29e-07 0.292     AGGGAATTTCCC
4 V_NFKB_Q6_01 chr22  51020064  51020079  + 16.9906 2.32e-07 0.146 TTGGGGGAAATTCCCT
5    V_RELA_Q6 chr22  51020067  51020078  - 15.7496 3.42e-07 0.433     GGGAATTTCCCC

我需要合并这两个数据帧,以便在这两个data.frames之间获得所有列v1、v2、v3和v4匹配的行。

我试过:

1
y<-merge(dat,dat.markov,by=c("V1","V2","V3","V4"))

它给了我一个合并的数据框架,但是有1513个OBS。但从技术上讲,观测的数量应等于或小于较小的数据帧,即1486 OBS。

合并后的data.frame在返回的列数方面看起来不错:

1
2
3
4
         V1    V2        V3        V4 V5.x    V6.x     V7.x  V8.x       V9.x V5.y    
1 V_CREL_01 chr10 112778464 112778473    + 12.9434 1.94e-05 0.694 TGGGTTTTCC    +  
     V6.y     V7.y  V8.y       V9.y
1 12.8838 2.35e-05 0.788 TGGGTTTTCC

我知道你可以用一列来相交data.frames,但是有没有一种方法可以让你在多列上相交两个data.frames?


如果我理解的话,您希望列1、2、3、4在两个框架中完全匹配,以便保留它们?除了merge外,我还使用interactionmatch函数

1
2
3
4
dat$combine = as.character(interaction(dat$V1, dat$V2, dat$V3, dat$V4))
dat.markov$combine = as.character(interaction(dat.markov$V1, dat.markov$V2, dat.markov$V3, dat.markov$V4))

dat.overlap = dat[complete.cases(match(dat.markov$combine, dat$combine)),]