2016-03-29 13 views
0

Ich habe einen Datenrahmen mit der Spalte 1, die das Gen ist und alle anderen Spalten Genausdruckdaten für dieses Gen unter verschiedenen Bedingungen sind. Ich möchte Gen für Gen gehen und alle Expressionswerte durch den Medianwert für dieses Gen teilen. Ich habe die Mediane in einem Datenrahmen namens s.med.df.Schleife durch Reihe über Teilmenge der Spalten

Ich versuche R zu lenken, um alle Expressionsspalten (2: n), aber nicht die erste Spalte durch den Medianwert für jedes Gen zu teilen. Ich bin neu in R, aber das Skript, das ich so weit habe, wie folgt:

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) 
} 

Vielen Dank im Voraus

+0

Ihre Daten zeigen, das Problem zu reproduzieren würde helfen. Sie können auch eine der 'Apply'-Funktionen verwenden, um die Berechnungen zu beschleunigen. – epo3

Antwort

0

Dies kann durch direkte Spaltung erreicht werden. Ändern Sie s.med.df in einen Vektor. Siehe das folgende Beispiel.

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 

Kann auch die Gen-Namen mit den Ergebnissen binden.

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

Danke! Das war viel einfacher als das, was ich versuchte, aber es funktionierte großartig! Es endete mit einer einzigen Zeile: 'Solid.mt.df [, - 1] <- Solid.mt.df [, - 1]/s.med.df $ Median' – Stranrar

0

Für alles, was mit der Anwendung eine Funktion über Spalten oder Zeilen zu tun, sind Sie für anwenden:

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

Dies nimmt den Datenrahmen mit Ausnahme der ersten Spalte, iteriert über die erste Achse (Zeilen) und wendet x/median (x) auf diese Zeilen an. Da R skalare Operationen an Vektoren sendet, erhalten Sie das gewünschte Ergebnis, aber es wird transponiert. Wenn Sie also t() einschalten, wird es wieder in das ursprüngliche Format umgewandelt. Dann können wir es mit den Gennamen zurücksenden.

0

wie @VenYao wies darauf hin, Sie können direkte Division verwenden, wenn Sie Ihre Mediane in einen Vektor verwandeln. Es wäre hilfreich zu zeigen, welche Struktur Ihre s.med.df-Datei ist.

werden Dies kann mit data.table ziemlich leicht erreicht:

cbind Ihre Datenrahmen in eine 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] 
Verwandte Themen