我有两个以下列表(实际列表会更大):
> 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的新手,数据处理对我来说仍然是一个谜。
提前致谢。
答案 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 column
为human genes
,rat 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:
NUDT5
位于humanlist
,但Nud5
未列入候选名单
{li> Sdhb
位于ratlist
,但SDHB1
未列入人名列表
Dok10
和DOCK10
答案 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倍,如果您必须重复加入大表,则需要考虑这一点。