R:按公共列加入/合并数据帧列表并附加

时间:2014-08-17 07:32:38

标签: r list join merge dataframe

我正在寻找一种方法将一个(长)数据帧列表合并到一个数据帧中,方法是保留公共列并附加一个包含每个数据帧中不同值的列。

head(dflist[['sampleA']])
seqnames   start     end width strand           gene reads
1     chr1   30366   30503   138      + hsa-mir-1302-2     7
2     chr1 1102484 1102578    95      +   hsa-mir-200b  2158
3     chr1 1103243 1103332    90      +   hsa-mir-200a 12939
4     chr1 1104385 1104467    83      +    hsa-mir-429  2775
5     chr1 3044539 3044599    61      +   hsa-mir-4251     0
6     chr1 3477259 3477354    96      -   hsa-mir-551a   464

head(dflist[['sampleB']])
  seqnames   start     end width strand           gene reads
1     chr1   30366   30503   138      + hsa-mir-1302-2     6
2     chr1 1102484 1102578    95      +   hsa-mir-200b  1407
3     chr1 1103243 1103332    90      +   hsa-mir-200a  8874
4     chr1 1104385 1104467    83      +    hsa-mir-429  1721
5     chr1 3044539 3044599    61      +   hsa-mir-4251     0
6     chr1 3477259 3477354    96      -   hsa-mir-551a   349

我想要的是这样的输出:

 seqnames   start     end width strand           gene reads.sampleA
1     chr1   30366   30503   138      + hsa-mir-1302-2     7
2     chr1 1102484 1102578    95      +   hsa-mir-200b  2158
3     chr1 1103243 1103332    90      +   hsa-mir-200a 12939
4     chr1 1104385 1104467    83      +    hsa-mir-429  2775
5     chr1 3044539 3044599    61      +   hsa-mir-4251     0
6     chr1 3477259 3477354    96      -   hsa-mir-551a   464
reads.sampleB
1                                      6
2                                   1407
3                                   8874
4                                   1721
5                                      0
6                                    349

我非常确定这是一项相当简单和常见的任务,但我无法找到/谷歌这样做的方法。

2 个答案:

答案 0 :(得分:3)

或者您可以尝试join_all获取一长串data.frames

  library(plyr)
  join_all(dfList, by=names(dfList[[1]][-7]))
  #   seqnames   start     end width strand           gene reads reads
  #1     chr1   30366   30503   138      + hsa-mir-1302-2     7     6
  #2     chr1 1102484 1102578    95      +   hsa-mir-200b  2158  1407
  #3     chr1 1103243 1103332    90      +   hsa-mir-200a 12939  8874
  #4     chr1 1104385 1104467    83      +    hsa-mir-429  2775  1721
  #5     chr1 3044539 3044599    61      +   hsa-mir-4251     0     0
  #6     chr1 3477259 3477354    96      -   hsa-mir-551a   464   349

答案 1 :(得分:2)

这是一个简单的合并。默认情况下,合并函数会合并所有常用名称,但您希望合并除姓氏之外的所有名称,因此请将其从提供给by的字符向量中删除:

merge(dflist[[1]], dflist[[2]], by=names(dflist[[1]][-7])  )
  seqnames   start     end width strand           gene reads.x reads.y
1     chr1 1102484 1102578    95      +   hsa-mir-200b    2158    1407
2     chr1 1103243 1103332    90      +   hsa-mir-200a   12939    8874
3     chr1 1104385 1104467    83      +    hsa-mir-429    2775    1721
4     chr1   30366   30503   138      + hsa-mir-1302-2       7       6
5     chr1 3044539 3044599    61      +   hsa-mir-4251       0       0
6     chr1 3477259 3477354    96      -   hsa-mir-551a     464     349