【问题标题】:Regular expression and calculation of median in RR中中位数的正则表达式和计算
【发布时间】:2015-12-12 18:52:41
【问题描述】:

我有一个表达矩阵,即一个包含一些基因在不同人类样本中的表达水平的矩阵,并且有一些样本是重复的,所以我需要结合这些重复中的表达并计算中位数。 我将样本的名称作为行,在每一列中我都有一个基因的表达。 (我有大约 200,000 个基因,所以大约有 200,000 列)。 第一列如下所示:

Adipocyte - breast, donor1
Adipocyte - breast, donor2
Adipocyte - omental, donor1
Adipocyte - omental, donor2
Adipocyte - omental, donor3
Alveolar Epithelial Cells, donor1
Alveolar Epithelial Cells, donor2
Amniotic Epithelial Cells, donor1
Amniotic Epithelial Cells, donor3

其余列对应数字(不同基因的表达)。

所以我认为我需要首先编写一个正则表达式来抓取那些在昏迷之前相等的行,以便它捕获相同细胞类型的不同供体,然后计算每个基因表达的中位数。

关于如何做到这一点的任何想法?

【问题讨论】:

  • 这些是行名,矩阵的其余部分是数字吗?或者这是第一列,在这种情况下您的矩阵将不是数字?还是你有一个数据框?
  • 它是一列,而不是行名。 row.names 是包含每个样本代码的另一列。 (但我可以改变它)。其余为数字

标签: regex r


【解决方案1】:

这是一个不太优雅的解决方案(主要是因为字符串拆分函数“strsplit”),但它不需要任何额外的包,并且更容易理解,因为 R 用户更熟悉语法(之前的解决方案是使用包我相信是 Hadley Wickham 写的,他使用的语法略有不同)。

# Dummy data
dat <- data.frame(tissue = c("Adipocyte - breast, donor1", 
                             "Adipocyte - breast, donor2", 
                             "Adipocyte - omental, donor1", 
                             "Adipocyte - omental, donor2",
                             "Adipocyte - omental, donor3", 
                             "Alveolar Epithelial Cells, donor1",
                             "Alveolar Epithelial Cells, donor2", 
                             "Amniotic Epithelial Cells, donor1",
                             "Amniotic Epithelial Cells, donor3"),
                  val1 = rnorm(9),
                  val2 = rnorm(9),
                  val200000 = rnorm(9))


# Use "aggregate" function form the default "stats" package
aggregate(x = dat[2:ncol(dat)],
          by = list(factor(do.call("c", 
                                   lapply(strsplit(x = as.character(dat$tissue), 
                                                   split = ","),
                                          function(a)a[1])))),
          FUN = "median")

【讨论】:

  • 您可以将by 简化为list(unlist(strsplit(x = as.character(dat$tissue), split = ",.*$"))) 或只是list(gsub('(.*)(,.*)', '\\1', dat$tissue))
猜你喜欢
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
相关资源
最近更新 更多