在列子集中按行循环

时间:2016-03-29 15:39:10

标签: r loops

我有一个数据框,第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)
}

提前谢谢

3 个答案:

答案 0 :(得分:0)

这可以通过直接划分来实现。将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))

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

像@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]