基于根据一对一匹配规则比较两个列值来合并两个数据帧列表

时间:2014-08-07 02:58:40

标签: r list generics merge dataframe

我有两个以下列表(实际列表会更大):

 > ratList
     ratGene      ratReplicate    ratAlignment  ratRNAtype
10    Sdhb   Thymus_M_GSM1328752            2        reg
11    Fasn   Thymus_M_GSM1328752            2        reg
12   Dok10   Thymus_M_GSM1328752            2        rev
13   Hspa5   Thymus_M_GSM1328752            2        reg
14   Cmpk1   Thymus_M_GSM1328752            3        reg

> humanList
   humanGene                            humanReplicate humanAlignment humanRNAtype
61    DOCK10 Fetal_Brain_408_AGTCAA_L004_R1_report.txt              6          reg
62     NUDT5 Fetal_Brain_408_AGTCAA_L004_R1_report.txt              5          dup
63      GRM8 Fetal_Brain_408_AGTCAA_L004_R1_report.txt              5          rev
64      PHC3 Fetal_Brain_408_AGTCAA_L004_R1_report.txt              7          reg
65      EI24 Fetal_Brain_408_AGTCAA_L004_R1_report.txt             13          rev

现在我想合并这两个列表并生成表格

的数据框/列表df
humanGene humanAlignment humanRNAtype ratGene ratAlignment ratRNAtype
DOCK10        6            reg         Dok10      2          reg

合并过程将通过形式的另一个文本文件geneData.txt的帮助来完成:

AAED1,Aaed1
AAGAB,Aagab
AAK1,Aak1
AAMDC,Aamdc
AAMP,Aamp
AANAT,Aanat
AAR2,AAR2

此处在每一行中,第一个词对应于人类基因,第二个词对应于大鼠基因(例如:AAED1是人类基因,相应的大鼠基因是Aaed1)。我需要以某种方式合并ratList和humanList,因此在合并列表的每一行中,我都有文本文件建议的相应的大鼠和人类基因。在humanList中,如果对于ratList中不存在的基因存在行,我将在制作合并列表时忽略该基因。同样适用于humanList中不存在的ratList中的基因。

有人可以帮我这么做吗?我是R的新手,数据处理对我来说仍然是一个谜。

提前致谢。

3 个答案:

答案 0 :(得分:0)

假设它们是数据框而不是列表

ratList$humanGene <- toupper(ratList$ratGene)
New.df <- merge(ratList,humanList,by="humanGene")

在这组数据中没有任何相同的基因,所以这会将New.df作为空数据帧。 查找?merge以获取其他选项。

如果它们是每个数据框的列表

ratList[[1]]$humanGene <- toupper(ratList[[1]]$ratGene)
New.df <- merge(ratList[[1]],humanList[[1]],by="humanGene")

答案 1 :(得分:0)

您可以尝试:

假设geneData.txt可以读入两列data.frame,first columnhuman genesrat genes

geneData <- structure(list(human = c("DOCK10", "NUDT5", "SDHB1", "AAED1", 
"AAGAB"), rat = c("Dok10", "Nud5", "Sdhb", "Aaed1", "Aagab")), .Names = c("human", 
"rat"), class = "data.frame", row.names = c(NA, -5L))



  res <-  merge(merge(geneData, humanlist, by.x="human", by.y="humanGene"), ratlist, by.x="rat", by.y="ratGene")

res[,c(2,4,5,1,7,8)]
 #    human humanAlignment humanRNAtype   rat ratAlignment ratRNAtype
 # 1 DOCK10              6          reg Dok10            2        rev

example for geneData:

    {li> NUDT5位于humanlist,但Nud5未列入候选名单 {li> Sdhb位于ratlist,但SDHB1未列入人名列表
  • 两个列表中都找不到某些基因名称
  • 此处,两个列表中只找到Dok10DOCK10

答案 2 :(得分:0)

如果要合并两个大的data.frame,最好使用inner_join()包中的dplyr函数,这比merge()要快得多。

首先是数据:

ratList <- read.table(text="
     ratGene      ratReplicate    ratAlignment  ratRNAtype
10    Sdhb   Thymus_M_GSM1328752            2        reg
11    Fasn   Thymus_M_GSM1328752            2        reg
12   Dok10   Thymus_M_GSM1328752            2        rev
13   Hspa5   Thymus_M_GSM1328752            2        reg
14   Cmpk1   Thymus_M_GSM1328752            3        reg
", stringsAsFactors=F)

humanList <- read.table(text="
   humanGene                            humanReplicate humanAlignment humanRNAtype
61    DOCK10 Fetal_Brain_408_AGTCAA_L004_R1_report.txt              6          reg
62     NUDT5 Fetal_Brain_408_AGTCAA_L004_R1_report.txt              5          dup
63      GRM8 Fetal_Brain_408_AGTCAA_L004_R1_report.txt              5          rev
64      PHC3 Fetal_Brain_408_AGTCAA_L004_R1_report.txt              7          reg
65      EI24 Fetal_Brain_408_AGTCAA_L004_R1_report.txt             13          rev

", stringsAsFactors=F)

# using the geneData akrun provided
geneData <- structure(list(
  human = c("DOCK10", "NUDT5", "SDHB1", "AAED1", "AAGAB"), 
  rat = c("Dok10", "Nud5", "Sdhb", "Aaed1", "Aagab")), 
  .Names = c("humanGene", "ratGene"), 
  class = "data.frame", 
  row.names = c(NA, -5L))

在实践中,您可以阅读geneData使用,

geneData <- read.csv("geneData.csv", header=F)
names(geneData) <- ("humanGene", "ratGene")

以下是一些快速基准:

合并

library(microbenchmark)

microbenchmark(
  merge(
    merge(geneData, humanList, by="humanGene"),
    ratList, by="ratGene"
  ), unit="us"
)

输出:

Unit: microseconds
                                                                              expr      min       lq   median       uq      max
 merge(merge(geneData, humanList, by = "humanGene"), ratList,      by = "ratGene") 1517.795 1565.213 1584.099 1645.475 6441.493
 neval
   100

dplyr

microbenchmark(
  inner_join(
    inner_join(humanList, geneData, by="humanGene"),
    ratList, by="ratGene"
  )
)

输出:

Unit: microseconds
                                                                                        expr     min      lq   median     uq
 inner_join(inner_join(humanList, geneData, by = "humanGene"),      ratList, by = "ratGene") 251.666 256.388 258.4405 261.93
     max neval
 488.142   100

您可以看到dplyr:::inner_join()merge()快6倍~7倍,如果您必须重复加入大表,则需要考虑这一点。