【问题标题】:Intersect dataframe on multiple columns [duplicate]在多列上相交数据框[重复]
【发布时间】:2013-09-13 08:50:44
【问题描述】:

我有 2 个数据框:

dat:9 个变量的 1900 个 obs

              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:9 个变量的 1486 个 obs

            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 的行。

我试过了:

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

这给了我一个合并的数据框,但有 1513 个 obs。但从技术上讲,观察的数量应该等于或小于较小的数据帧,即 1486 obs。

就返回的列数而言,我合并的 data.frame 看起来不错:

         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 相交?

【问题讨论】:

  • 您这样做是正确的,但是,如果您的行中这三列的组合不是唯一的,您可能会得到一个非常大的结果!例如merge(data.frame(X=rep(1:4, 2), Y1=LETTERS[1:4]), data.frame(X=1:3, Y2=letters[1:3])) 结果比第二个输入长。
  • 我认为你是对的,我刚刚检查过,在我的合并数据框中有很多重复项。所以根据数据,我的代码可以工作。谢谢!

标签: r intersection


【解决方案1】:

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

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)),]

【讨论】:

  • 这不会像merge 那样将dat.markov 中包含的其他列带入生成的dat.overlap
  • 真的。您可以将最后一行与对 dat.markov 的类似调用结合起来并翻转 match 争论,然后指定您想要的列。真的,merge 然后unique 在 ID 类型变量上是要走的路。
  • @dylanjf:interaction 函数确实存在内存问题。 R 只是在我尝试使用它时挂起,所以我只需要合并我的数据。我之前尝试过unique,但我认为我不能使用它,因为即使 V1、V2、V3 和 V4 列相同,对应的列也不唯一。
猜你喜欢
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
相关资源
最近更新 更多