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

R 连接3个数据集以分析重复行,r,data-structures,R,Data Structures,我试图预处理三组与微阵列实验相关的数据。每个数据集都来自CSV文件,是基因数据的翻译表。在所有3个数据帧中都有一个公共列(外键),GeneID。假设(但未确认)所有数据文件中都存在每个GeneID值 数据中的一个示例: Data 1: Data 2: Data 3: ID GeneID ; HID GeneID ; SNP_locusID GeneID rs243

我试图预处理三组与微阵列实验相关的数据。每个数据集都来自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èU rocusId之间可能存在多对多、一对多或多对一的关系。最大的CSV文件大约有1000000行,但是执行速度不是一个重要的考虑因素

为了能够选择一种适当的方法来处理重复的值,我尝试创建一个单一的、全面的表,显示每个GeneID及其对应的ID、HID和SNP_值,即

GeneID         ID         HID         SNP_locusID
10151          rs855      10          rs852
10151          rs856      7           rs853
10151          NA         NA          rs854
然后,下一步将查找GeneID的每个重复值,并删除重复的行,以便每行有一个唯一的GeneID

我尝试过使用
sqldf
,但它似乎不支持完全的外部联接,我假设这是创建所需输出所需的(我的SQL知识非常基础,所以建议很受欢迎!)。我还尝试先单独分析每个数据文件,通过

data1[duplicated(data1[, 'GeneID']),]
然后尝试合并数据集。但我不确定这是否是将GeneID整合为每行一个GeneID的最佳方法

编辑:谢谢马丁和汉斯-这是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))

我认为您可以使用
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
require(plyr)

所有的基因都试图生成一个小的可重复的例子,这样回答你的问题就更容易了。使用dput(样本数据)生成代码,可以轻松地复制你的样本数据供人们使用。我不相信你的示例输出是否符合你的预期目的。为什么要在同一行输出上组合ID“rs855”、HID“10”和SNP_ID“rs852”?为什么没有ID“rs856”、HID“10”和SNP“rs852”?看起来您已经在应用某种分组,这种分组可能有意义,也可能没有意义。您是对的,dg99:我手动创建了示例,只是为了尝试说明我正在寻找的输出类型。好的,您解决了示例问题。现在您需要解决dg99提出的概念问题。如果一个项目在一个数据集中重复,而不是在另一个数据集中重复,您提出的解决方案将返回不准确的结果。太棒了-非常感谢!我试图用plyr来确定复制品,但这正是我要寻找的。