【问题标题】:Looping by row across subset of columns跨列子集按行循环
【发布时间】:2016-07-17 06:41:26
【问题描述】:

我有一个数据框,第 1 列是基因,所有其他列是该基因在不同条件下的基因表达数据。我想逐个基因地去基因并将所有表达值除以该基因的中值表达值。我在一个名为 s.med.df 的数据框中有中位数。

我试图指示 R 将所有表达列 (2:n) 但不是第一列除以每个基因的中值。我是 R 新手,但到目前为止我的脚本如下:

Con1 <- c(5088.77, 274.62, 251.97, 122.21)
Con2 <- c(4382.59, 288.55, 208.12, 171.93)
Con3 <- c(4732.81, 417.43, 305.58, 132.93)
Solid.df <- data.frame(Gene = c("A", "B", "C", "D"), Con1=Con1, Con2=Con2, Con3=Con3)

Gene    Con1     Con2     Con3
A       5088.77  4382.59  4732.81
B       274.62   288.55   417.43
C       251.97   208.12   305.58
D       122.21   171.93   132.93

n <- ncol(Solid.df)
genes = levels(s.med.df$Gene)
Solid.mt.df = Solid.df
for (i in 1:length(genes)) {
  gene = genes[i]
  Solid.mt.df[2:n][Solid.mt.df$Gene == gene] = Solid.mt.df[2:n][Solid.mt.df$Gene == gene] / s.med.df$Medians[i]
  print(gene)
}

提前谢谢你

【问题讨论】:

  • 显示您的数据将有助于重现问题。您可能还想使用apply 函数之一来加快计算速度。

标签: r loops


【解决方案1】:

这可以通过直接除法来实现。将s.med.df 更改为向量。请参阅以下示例。

d1 <- data.frame(ge=c("A", "B", "C"), e1=1:3, e2=7:9,
                 stringsAsFactors = FALSE)
m1 <- data.frame(md=4:6, stringsAsFactors = FALSE)

d1[,2:3]/unlist(m1)
#     e1   e2
# 1 0.25 1.75
# 2 0.40 1.60
# 3 0.50 1.50

还可以将基因名称与结果绑定。

cbind(d1[,1], d1[,2:3]/unlist(m1))

【讨论】:

  • 谢谢!这比我尝试做的要简单得多,但效果很好!它最终变成了一行:Solid.mt.df[,-1] &lt;- Solid.mt.df[,-1] / s.med.df$Medians
【解决方案2】:

关于在列或行上应用函数的任何事情,您都在寻找 apply:

median_centered <- t(apply(genes[,2:length(genes)], 1, function(x) x / median(x)))
genes2 <- cbind(genes[,1], median_centered)

这将获取除第一列之外的数据框,迭代第一个轴(行),并将 x / 中位数(x)应用于这些行。由于 R 将标量操作广播到向量,您将获得所需的结果,但它会被转置,因此在其上调用 t() 会将其恢复为原始格式。然后我们可以将它与基因名称 cbind。

【讨论】:

    【解决方案3】:

    就像@VenYao 指出的那样,如果将中位数转换为向量,则可以使用直接除法。显示您的 s.med.df 文件的结构会很有帮助。

    这可以很容易地使用data.table 实现:

    cbind 将您的数据框放入 data.table:

    library(data.table)
    combined <- data.table(cbind(Solid.df, s.med.df))
    combined[, med.con1 := Con1/median]  
    # assume median is the column in s.med.df that stores median values. 
    # then you can repeat that for all three conditions:
    combined[, med.con2 := Con2/median] 
    combined[, med.con2 := Con2/median] 
    

    【讨论】:

      猜你喜欢
      • 2014-02-20
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多