使用split函数按因子分组数据帧,替代大型数据帧

ava*_*ari 5 split r

我有一个关于使用该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`无效.

任何有关替代方法的建议将非常感谢!

Fra*_*ank 2

有一种更短的方法来创建您的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")]