2015-01-21 38 views
0

我想根据列C合并四个表。但是,如果在一个表中找到一行,但在其他表中找不到行,则应在V8列中收到0。希望的输出。然而,我尝试了正常的merge,然后它合并了所有表中找到的行,这不是我想要的。我想包含也只能在表的子集中找到的行。合并列并保留那些不常见的列

> Ago1 <- Combined_59[,c("C","V8")] 
> head(Ago1) 
             C  V8 
1 hsa-miR-21-5p_TAGCTTATCAGACTGATGTTGA 295649 
2 hsa-let-7f-5p_TGAGGTAGTAGATTGTATAGTT 180249 
3 hsa-let-7a-5p_TGAGGTAGTAGGTTGTATAGTT 165935 
4 hsa-miR-21-5p_TAGCTTATCAGACTGATGTTGAC 141379 
5 hsa-miR-21-5p_TAGCTTATCAGACTGATGTTGACT 81026 
6 hsa-miR-99b-5p_CACCCGTAGAACCGACCTTGCG 66289 
> 
> Ago2 <- Combined_60[,c("C","V8")] 
> head(Ago2) 
             C  V8 
1 hsa-miR-21-5p_TAGCTTATCAGACTGATGTTGAC 304165 
2 hsa-miR-99b-5p_CACCCGTAGAACCGACCTTGCG 95169 
3 hsa-miR-92a-3p_TATTGCACTTGTCCCGGCCTG 73501 
4 hsa-miR-21-5p_TAGCTTATCAGACTGATGTTGA 225277 
5 hsa-miR-21-5p_TAGCTTATCAGACTGATGTTG 43357 
    > 
> Ago3 <- Combined_61[,c("C","V8")] 
> head(Ago3) 
             C  V8 
1 hsa-miR-21-5p_TAGCTTATCAGACTGATGTTGAC 311106 
2 hsa-miR-21-5p_TAGCTTATCAGACTGATGTTGACT 38969 
3 hsa-miR-30e-3p_CTTTCAGTCGGATGTTTACAGC 34218 
4 hsa-miR-21-5p_TAGCTTATCAGACTGATGTTGA 29467 
5 hsa-miR-99b-5p_CACCCGTAGAACCGACCTTGCG 25616 
6 hsa-miR-532-5p_CATGCCTTGAGTGTAGGACCGT 24568 
> 
> Ago4 <- Combined_62[,c("C","V8")] 
> head(Ago4) 
             C V8 
1 hsa-miR-21-5p_TAGCTTATCAGACTGATGTTGAC 6922 
2 hsa-miR-21-5p_TAGCTTATCAGACTGATGTTGA 5456 
3 hsa-miR-21-5p_TAGCTTATCAGACTGATGTTGACT 2325 
4 hsa-miR-99b-5p_CACCCGTAGAACCGACCTTGCG 1019 
5 hsa-miR-378a-3p_ACTGGACTTGGAGTCAGAAGGC 516 
6 hsa-miR-30e-3p_CTTTCAGTCGGATGTTTACAGC 513 

输出:

        C V8_Ago1 V8_Ago2 V8_Ago3 V8_Ago4 
    hsa-miR-21-5p_TAGCTTATCAGACTGATGTTGAC 6922  304165 311106 6922 
    hsa-miR-30e-3p_CTTTCAGTCGGATGTTTACAGC 0  0   34218  513 
    .... 
    ... 
+0

显然,这不与0产生的任何行应该有一些独特的重新给一个表,因此产生0 – BioMan 2015-01-21 10:36:42

+0

尝试'减少(函数(...)合并(...,由= 'C',all = TRUE),lst2)'并将NA改为0。 lst2是数据集的列表 – akrun 2015-01-21 10:37:32

+0

也许all = T在合并函数中? – BioMan 2015-01-21 10:38:03

回答

2

这是更好地读取所有数据集中到一个列表,但如果你已经创建单独的数据集对象(“前” S)。使用mget获取列表中的对象,然后更改第二列名称(事实上,它不是必需的,由于列名重复,会出现警告消息,为避免这种情况,可以使用更改的列名创建“lst2”) 。

lst <- mget(paste0('Ago', 1:4)) 
lst2 <- lapply(seq_along(lst), function(i) { 
      x1 <- lst[[i]] 
      names(x1)[2] <- paste(names(x1)[2], names(lst)[i], sep="_") 
      x1}) 
res <- Reduce(function(...) merge(..., by='C', all=TRUE), lst2) 
res[is.na(res)] <- 0