连接3个数据集以分析重复行

时间:2014-01-03 18:53:47

标签: r data-structures

我正在尝试预处理与微阵列实验相关的三组数据。每个数据集来自CSV文件,并且是基因数据的转换表。所有3个数据帧中都有一个公共列(外键)GeneID。假设 - 但未确认 - 每个GeneID值都存在于所有数据文件中。

数据的一个例子:

 Data 1:                   Data 2:               Data 3:
 ID           GeneID  ;    HID     GeneID    ;   SNP_locusID    GeneID
 rs243        7093    ;    3       34        ;   rs852          10151
 rs790        3778    ;    3       11364     ;   rs853          10151
 rs791        3778    ;    5       37        ;   rs854          10151
 rs818        7093    ;    5       11370     ;   rs856          10151
 rs855        10151   ;    6       38        ;   rs872          10539
 rs856        10151   ;    10      10151     ;   rs907          221037
 rs907        221037  ;    7       90        ;   rs916          55747
 rs916        55747   ;    7       10151     ;   rs916          387680
 rs916        387680  ;    9       6442      ;   rs941          414308
 rs941        414308  ;    9       20391     ;   rs778          55747

GeneID,HID和SNP_locusID之间可能存在多对多,一对多或多对一关系。最大的CSV文件大约有1,000,000行,但执行速度并不是一个重要的考虑因素。

为了能够选择合适的方法来处理重复的值,我正在尝试创建一个单独的综合表,显示每个GeneID及其相应的ID,HID和SNP_locusID值 - 即。

GeneID         ID         HID         SNP_locusID
10151          rs855      10          rs852
10151          rs856      7           rs853
10151          NA         NA          rs854

等。然后,下一步将找到GeneID的每个重复值,并删除重复的行,以便每行具有一个唯一的GeneID。

我尝试过使用sqldf,但它似乎不支持完整的外连接,我假设是我需要创建所需的输出(我的SQL知识非常基本,所以建议赞赏!)。我还尝试首先分别分析每个数据文件,通过

找到重复的GeneID
data1[duplicated(data1[, 'GeneID']),]

然后尝试合并数据集。但我不确定这是否是将GeneID合并为每行一个GeneID的最佳方法?

编辑:感谢Martin和Hans - 这是dput的结果......数据1输出现在也得到了修正。

> dput(data1)
structure(list(ID = structure(c(1L, 2L, 3L, 4L, 5L, 
6L, 7L, 8L, 8L, 9L), .Label = c("rs243", "rs790", "rs791", "rs818", 
"rs855", "rs856", "rs907", "rs916", "rs941"), class = "factor"), 
GeneID = c(7093L, 3778L, 3778L, 7093L, 10151L, 10151L, 221037L, 
55747L, 387680L, 414308L)), .Names = c("ID", "GeneID"
), class = "data.frame", row.names = c(NA, -10L))

> dput(data2)
structure(list(HID = c(3L, 3L, 5L, 5L, 6L, 10L, 7L, 7L, 9L, 9L
), GeneID = c(34L, 11364L, 37L, 11370L, 38L, 10151L, 90L, 10151L, 
6442L, 20391L)), .Names = c("HID", "GeneID"), class = "data.frame", row.names = c(NA, 
-10L))

> dput(data3)
structure(list(SNP_locusID = structure(c(2L, 3L, 4L, 5L, 6L, 
7L, 8L, 8L, 9L, 1L), .Label = c("rs778", "rs852", "rs853", "rs854", 
"rs856", "rs872", "rs907", "rs916", "rs941"), class = "factor"), 
GeneID = c(10151L, 10151L, 10151L, 10151L, 10539L, 221037L, 
55747L, 387680L, 414308L, 55747L)), .Names = c("SNP_locusID", 
"GeneID"), class = "data.frame", row.names = c(NA, -10L))

1 个答案:

答案 0 :(得分:2)

我认为你可以使用plyr::join,这很快:

require(plyr)
all_genes <- join(data1, data2, by = "GeneID", type = "full")
all_genes <- join(all_genes, data3, by = "GeneID", type = "full")

> all_genes
      ID GeneID HID SNP_locusID
1  rs243   7093  NA        <NA>
2  rs790   3778  NA        <NA>
3  rs791   3778  NA        <NA>
4  rs818   7093  NA        <NA>
5  rs855  10151  10       rs852
6  rs855  10151  10       rs853
7  rs855  10151  10       rs854
8  rs855  10151  10       rs856
9  rs855  10151   7       rs852
10 rs855  10151   7       rs853
11 rs855  10151   7       rs854
12 rs855  10151   7       rs856
13 rs856  10151  10       rs852
14 rs856  10151  10       rs853
15 rs856  10151  10       rs854
16 rs856  10151  10       rs856
17 rs856  10151   7       rs852
18 rs856  10151   7       rs853
19 rs856  10151   7       rs854
20 rs856  10151   7       rs856
21 rs907 221037  NA       rs907
22 rs916  55747  NA       rs916
23 rs916  55747  NA       rs778
24 rs916 387680  NA       rs916
25 rs941 414308  NA       rs941
26  <NA>     34   3        <NA>
27  <NA>  11364   3        <NA>
28  <NA>     37   5        <NA>
29  <NA>  11370   5        <NA>
30  <NA>     38   6        <NA>
31  <NA>     90   7        <NA>
32  <NA>   6442   9        <NA>
33  <NA>  20391   9        <NA>
34  <NA>  10539  NA       rs872

我没有处理重复,因为不清楚你要保留哪一个。如果您只想保留第一个,请按照自己的建议进行预处理,data1 <- data1[!duplicated(data1$GeneID), ]等。