使用 split 函数按因子对数据帧进行分组,大型数据帧的替代方案

Using the split function to group a dataframe by factor, alternatives for large dataframes

我有一个关于使用 split 函数按 factor 分组数据的问题。

我有一个包含两列 snps 和 gene 的数据框。 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")

然而,这对我的完整数据框无效(可能是由于它的大小——363422 行、281370 个独特的 snps、20888 个独特的基因)并且 R 在稍后尝试加载 df.2.rda` 时崩溃。

如有任何关于替代方法的建议,我们将不胜感激!

创建 df.2:

的方法更短
genes_by_snp <- split(df$gene,df$snp)

您可以使用 genes_by_snp[["rs10000226"]] 查看给定 snp 的基因。


你的数据集对我来说听起来并不大,但你可以通过以不同方式存储原始数据来避免创建上面的列表。扩展@AnandoMahto 的评论,这里是如何使用 data.table 包:

require(data.table)

setDT(df)
setkey(df,snps)

您可以使用 df[J("rs10000226")] 查看给定 snp 的基因。