首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接3个数据集以分析重复的行

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

Stack Overflow用户
提问于 2014-01-03 18:53:47
回答 1查看 84关注 0票数 0

我试图预处理三组与微阵列实验有关的数据。每个数据集来自CSV文件,是基因数据的翻译表。在所有三个数据帧中都有一个公共列(外键) GeneID。假设(但没有确认)每个GeneID值都存在于所有数据文件中。

数据中的一个例子:

代码语言:javascript
复制
 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值--即

代码语言:javascript
复制
GeneID         ID         HID         SNP_locusID
10151          rs855      10          rs852
10151          rs856      7           rs853
10151          NA         NA          rs854

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

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

代码语言:javascript
复制
data1[duplicated(data1[, 'GeneID']),]

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

编辑:谢谢马丁和汉斯-这是dput的结果.数据1输出现在也修正了。

代码语言:javascript
复制
> 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))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-03 19:47:12

我认为您可以使用plyr::join,它非常快速:

代码语言:javascript
复制
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), ]等等。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20910752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档