我有一个数据框,第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)
}
提前谢谢
答案 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)
这可以很容易地使用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]