R 连接3个数据集以分析重复行
我试图预处理三组与微阵列实验相关的数据。每个数据集都来自CSV文件,是基因数据的翻译表。在所有3个数据帧中都有一个公共列(外键),GeneID。假设(但未确认)所有数据文件中都存在每个GeneID值 数据中的一个示例: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
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来确定复制品,但这正是我要寻找的。