【问题标题】:Using the split function to group a dataframe by factor, alternatives for large dataframes使用 split 函数按因子对数据帧进行分组,大型数据帧的替代方案
【发布时间】:2015-04-27 13:48:48
【问题描述】:

我有一个关于使用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")

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

任何关于替代方法的建议将不胜感激!

【问题讨论】:

  • 你为什么不使用“data.table”,只需按“snps”列键。然后您可以轻松检查不同的值。
  • 您的 split 没有“列出每个 snp 映射到的基因列表”。它的作用正好相反:按基因分组(split 的第二个参数)。
  • 分手后你打算怎么处理?您真正需要的输出是什么?
  • 您可能需要向我们提供可重现的数据样本。 factor变量乱七八糟,分不清哪一列是哪个类。
  • 你的最终结果和split(df$gene,df$snp)一样。这就是你要找的东西吗?

标签: r split


【解决方案1】:

有一种更短的方法可以创建您的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 的基因。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 2017-01-23
  • 2014-03-23
  • 1970-01-01
相关资源
最近更新 更多