我有一个关于使用该split功能分组数据的问题factor.
我有一个两列snps和基因的数据框.Snps是一个因素,gene是一个字符向量.我想通过snp因子对基因进行分组,因此我可以看到映射到每个snp的基因列表.一些snps可能映射到一个以上的基因,例如rs10000226映射到基因345274和基因5783,并且基因多次出现.
为此,我使用split函数制作每个snp映射到的基因列表.
snps<-c("rs10000185", "rs1000022", "rs10000226", "rs10000226")
gene<-c("5783", "171425", "345274", "5783")
df<-data.frame(snps, gene) # snps is a factor
df$gene<-as.character(df$gene)
splitted=split(df, df$gene, drop=T) # group by gene
snpnames=unique(df$snps)
df.2<-lapply(splitted, function(x) { x["snps"] <- NULL; x }) # remove the snp column
names(df.2)=snpnames # rename the list elements by snp
df.2 = sapply(df.2, function(x) list(as.character(x$gene)))
save(df.2, file="df.2.rda")
Run Code Online (Sandbox Code Playgroud)
然而,这对我的完整数据帧(可能是由于其大小--363422行,281370个独特的snps,20888个独特基因)和R崩溃同时尝试加载df.2.rda`无效.
任何有关替代方法的建议将非常感谢!
有一种更短的方法来创建您的df.2:
genes_by_snp <- split(df$gene,df$snp)
Run Code Online (Sandbox Code Playgroud)
您可以使用 来查看给定 snp 的基因genes_by_snp[["rs10000226"]]。
您的数据集对我来说听起来并没有那么大,但是您可以通过以不同方式存储原始数据来避免创建上面的列表。扩展 @AnandoMahto 的评论,以下是如何使用该data.table包:
require(data.table)
setDT(df)
setkey(df,snps)
Run Code Online (Sandbox Code Playgroud)
您可以使用 来查看给定 snp 的基因df[J("rs10000226")]。