【问题标题】:Separating Data using \n AND \t使用 \n AND \t 分隔数据
【发布时间】:2018-01-23 23:20:23
【问题描述】:

我正在尝试使用 rstudio 中的“\n”将数据分成列,然后使用“\t”将该数据进一步分成行。到目前为止,我已经能够通过“\n”分隔数据,但我不知道如何通过“\t”进一步拆分数据。我在使用的数据中找不到任何标题名称,因为它是我从 msigdb 网站下载的表。这是我到目前为止所拥有的: matrix_sep_by_enter<-read.table("msigdb.v5.2.symbols.txt",sep = "\n")

如何使用 "\t" 进一步分隔

谢谢!

【问题讨论】:

  • 您能否提供一个可重现的示例?如果我们必须自己模拟 data.frames 或从外部下载它们才能开始回答您的问题,这很乏味。
  • 虽然我大体上同意@JereB,但遗憾的是,MSigDB 文件相当笨拙且不适合共享。或者,如果您想自己从 Broad 下载数据库文件,则必须注册一个(免费)帐户。一般来说,这应该是一个简单的问题:(1)逐行读取文件(例如使用read.table(..., sep = "\n"),然后(2)使用strsplit(..., "\t")根据"\t"分割每一行。请看一下我在下面给出的例子。

标签: r dataframe newline code-separation


【解决方案1】:

我不完全确定您想如何解析 MSigDB。我已经下载了最新的 MSigDB GMT 文件,因此我将根据该文件向您展示一种可能性。

  1. 读取 GMT 文件。

    df <- read.table("msigdb.v6.1.symbols.gmt", sep = "\n");
    

    这将创建一个data.frame,其中包含一列和与 GMT 文件中的行一样多的行。

  2. 根据"\t"将每一行拆分成子串

    lst <- apply(df, 1, function(x) unname(unlist(strsplit(x, "\t"))));
    

    结果存储在一个list的字符向量(不同长度)中,其中第一个条目给出基因集名称,第二个条目给出MSigDB基因集网络链接,其余条目是与相关的基因符号那个基因组。

    str(lst, list.len = 5);
    #List of 17786
    # $ : chr [1:195] "AAANWWTGC_UNKNOWN" "http://www.broadinstitute.org/gsea/msigdb/cards/AAANWWTGC_UNKNOWN" "MEF2C" "ATP1B1" ...
    # $ : chr [1:376] "AAAYRNCTG_UNKNOWN" "http://www.broadinstitute.org/gsea/msigdb/cards/AAAYRNCTG_UNKNOWN" "LTBP1" "PLEKHM1" ...
    # $ : chr [1:267] "MYOD_01" "http://www.broadinstitute.org/gsea/msigdb/cards/MYOD_01" "KCNE1L" "FAM126A" ...
    # $ : chr [1:255] "E47_01" "http://www.broadinstitute.org/gsea/msigdb/cards/E47_01" "MLIP" "FAM126A" ...
    # $ : chr [1:251] "CMYB_01" "http://www.broadinstitute.org/gsea/msigdb/cards/CMYB_01" "FAM126A" "C5orf64" ...
    #  [list output truncated]
    

【讨论】:

  • 谢谢!我了解您如何将数据制作成向量列表,并且我正在尝试将这些向量逐列放入矩阵中,但每次尝试将列表的一部分添加到矩阵时,我都无法做到得到一个错误,指出类型不匹配。有没有办法将字符向量添加到矩阵中,以便每个字符占据一个新单元格?
  • 简短的回答是您不能将向量放入matrix(或data.frame),因为它们都有不同的长度。如果他们样本长度,这将是使用cbind.data.frame 组合列的简单问题。长(更)的答案是,您可以组合它们,前提是您首先用例如填充它们来确保所有向量的长度相同。 NAs 根据需要。不过那会很丑陋。另一方面,使用list 的优势在于您可以使用完整的*apply 武器库来处理基因集。
  • 我的最终目标是使用聚类方法根据这些特征集中包含的基因来建立不同基因特征之间的相似性。这就是为什么我试图创建一个矩阵,以便我可以使用已经使用矩阵建立的聚类算法。如果我想创建长度相等的向量,我会使用任意长度创建向量并使用“fill=TRUE”吗?另外,假设我创建了这些向量并且有很多 NA,会创建一个稀疏矩阵来移除 NA 吗?感谢您的帮助!
  • @MauritsEvers,而不是apply(...),只需使用strsplit(as.character(df$V1), "\t")。此外,从技术上讲,您可以在 data.frame 中包含 list 列(即使在 matrix 中),但使用数据可能并不总是很方便。
  • @RohanSinghal,使用“data.table”,您应该能够执行library(data.table); out &lt;- fread("msigdb.v6.1.symbols.gmt", sep = "\n", header = FALSE)[, tstrsplit(V1, "\t")] 之类的操作。但是,结果表将是 17786 行乘近 2942 列......使用table(colSums(is.na(out)))table(rowSums(is.na(out))) 来了解丢失的数据。
猜你喜欢
  • 1970-01-01
  • 2017-11-30
  • 2013-06-19
  • 2018-10-30
  • 2013-10-27
  • 2016-04-29
相关资源
最近更新 更多