我正在尝试预处理与微阵列实验相关的三组数据。每个数据集来自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知识非常基本,所以建议赞赏!)。我还尝试首先分别分析每个数据文件,通过
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))
答案 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), ]
等。