使用split函数按因子对数据框进行分组,在处理大型数据框时的替代方法

5
我有一个关于如何使用split函数按factor分组数据的问题。
我有一个包含两列"snps"和"gene"的数据框。其中,"snps"是一个因子,"gene"是一个字符向量。我想通过snp因子来分组基因,以便查看每个snp映射到的基因列表。有些snp可能映射到多个基因,例如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个唯一基因),这种方法并不有效,当试图加载df.2.rda时,R会崩溃。如果有任何替代方法的建议,将不胜感激!

为什么不使用"data.table",并只按"snps"列进行键控。然后您可以轻松地检查不同的值。 - A5C1D2H2I1M1N2O1R2T1
你的 split 没有“制作每个 snp 映射到的基因列表”。它相反:按基因分组(作为 split 的第二个参数)。 - Frank
1
你打算在分割后用它做什么?你真正需要的输出是什么? - MrFlick
1
您可能需要提供一个可重现的数据样本。factor变量很混乱,我们无法确定哪一列是哪个类别。 - Frank
1
你的最终结果与 split(df$gene,df$snp) 相同。这是你要找的吗? - Frank
显示剩余2条评论
1个回答

2

有一个更简单的方法来创建您的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的基因。


1
将数据存储在data.table中还有其他优点,您可以从vignettes中了解到更多信息:https://github.com/Rdatatable/data.table/wiki/Getting-started - Frank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接