使用 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 的基因。
我有一个关于使用 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 的基因。