2016-04-27 8 views
0

Ich habe einen Datenrahmen wo für jeden Dateiname Wert gibt es eine Reihe von Werten für Verbindung. Einige Verbindungen haben einen Wert für IS.Name, bei dem es sich um einen Wert handelt, der einer der zusammengesetzten Werte für einen Dateinamen ist.R: Müssen mehrere Übereinstimmungen für jede Zeile im Datenrahmen durchgeführt werden

,Batch,Index,Filename,Sample.Name,Compound,Chrom.1.Name,Chrom.1.RT,IS.Name,IS.RT 
1,Batch1,1,Batch1-001,Sample001,Compound1,1,0.639883333,IS-1,0 
2,Batch1,1,Batch1-001,Sample001,IS-1,IS1,0.61,NONE,0 

Für jeden Satz von Zeilen mit dem gleichen Dateinamen Wert in meinem Datenrahmen, möchte ich mit der entsprechenden Verbindung Wert, der IS.Name Wert übereinstimmen und die Chrom.1.RT Wert von dem angepassten Zeile setzen in die IS.RT-Zelle. Zum Beispiel in der obigen Tabelle I den Chrom.1.RT Wert von Zeile 2 für die Verbindung nehmen will = IS-1 und steckt es in IS.RT auf Zeile 1 wie folgt aus:

,Batch,Index,Filename,Sample.Name,Compound,Chrom.1.Name,Chrom.1.RT,IS.Name,IS.RT 
1,Batch1,1,Batch1-001,Sample001,Compound1,1,0.639883333,IS-1,0.61 
2,Batch1,1,Batch1-001,Sample001,IS-1,IS1,0.61,NONE,0 

Wenn möglich I müssen Sie dies in R. Vielen Dank im Voraus für jede Hilfe!

EDIT: Hier ist ein größeres, detailliertere Beispiel:

Filename Compound Chrom.1.RT IS.Name IS.RT 
1 Sample-001 IS-1 1.32495 NONE NA 
2 Sample-001 Compound-1 1.344033333 IS-1 NA 
3 Sample-001 IS-2 0.127416667 NONE NA 
4 Sample-001 Compound-2 0 IS-2 NA 
5 Sample-002 IS-1 1.32495 NONE NA 
6 Sample-002 Compound-1 1.344033333 IS-1 NA 
7 Sample-002 IS-2 0.127416667 NONE NA 
8 Sample-002 Compound-2 0 IS-2 NA 

Dies ist die Chromatographie-Daten. Für jede Probe werden vier Verbindungen analysiert, und jede Verbindung hat einen Wert für die Retentionszeit (Chrom.1.RT). Zwei dieser Verbindungen sind Referenzen, die von den anderen beiden Verbindungen verwendet werden. Zum Beispiel verwendet Verbindung 1 IS-1, während IS-1 keine Referenz (IS) hat. In jedem Sample versuche ich, den IS-Namen mit der zusammengesetzten Zeile in Übereinstimmung zu bringen, damit er den CHrom.1.RT ergreift und ihn in das Feld IS.RT legt. Für Compound-1 möchte ich den Chrom.1.RT-Wert für die Verbindung mit dem gleichen Namen wie das IS.Name-Feld (IS-1) finden und ihn in das Feld IS.RT für Compound-1 einfügen. Die Tabellen, mit denen ich arbeite, listen alle Verbindungen zusammen auf und stimmen nicht mit den Werten für die Referenzen überein, die ich für den nächsten Schritt der Berechnung der Differenz zwischen Chrom.1.RT und IS.RT für jedes Paar benötige Verbindung. Hilft das?

EDIT - Hier ist der Code, den ich festgestellt, dass scheint zu funktionieren: diese effizienter zu machen, obwohl

sampleList<- unique(df1$Filename) 
for (i in sampleList){ 
    SampleRows<-which(df1$Filename == sampleList[i]) 
    RefRows <- subset(df1, Filename== sampleList[i]) 
    df1$IS.RT[SampleRows]<- RefRows$Chrom.1.RT[ match(df1$IS.Name[SampleRows], RefRows$Compound)] 
    } 

Ich bin für alle Vorschläge auf jeden Fall offen.

+0

Vielen Dank für die Formatierungshilfe! – krazeechemist78

+0

Probieren Sie 'df1 $ IS.RT <- mit (df1, Chrom.1.RT [match (IS.Name, Verbindung)])' und ersetzen Sie die 'NA' durch 0 – akrun

+0

Für diejenigen mit einem Wert in IS.Name das mit einer Verbindung übereinstimmt, setzte es in 0 für die IS.RT ein, anstatt den Chrom.1.RT-Wert richtig zu greifen. Ich hatte ein ähnliches Ergebnis mit df1 $ IS.RT <- df1 $ Chrom.1.RT [Übereinstimmung (df1 $ IS.Name, df1 $ Verbindung)]. – krazeechemist78

Antwort

0

Zunächst einmal, schlage ich Sie in Zukunft Ihr Beispiel als die Ausgabe von dput liefern (DF1), da es macht es viel einfacher, es in R zu lesen Sie statt der Raum begrenzt Tabelle

vorausgesetzt, dass gesagt, ich habe es geschafft, mit der "Hilfe" von MS Excel in R zu streiten.

df1=structure(list(Filename = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L), .Label = c("Sample-001", "Sample-002"), class = "factor"), 
Compound = structure(c(3L, 1L, 4L, 2L, 3L, 1L, 4L, 2L), .Label = c("Compound-1", 
"Compound-2", "IS-1", "IS-2"), class = "factor"), Chrom.1.RT = c(1.32495, 
1.344033333, 0.127416667, 0, 1.32495, 1.344033333, 0.127416667, 
0), IS.Name = structure(c(3L, 1L, 3L, 2L, 3L, 1L, 3L, 2L), .Label = c("IS-1", 
"IS-2", "NONE"), class = "factor"), IS.RT = c(NA, NA, NA, 
NA, NA, NA, NA, NA)), .Names = c("Filename", "Compound", 
"Chrom.1.RT", "IS.Name", "IS.RT"), class = "data.frame", row.names = c(NA, 
-8L)) 

Der folgende Code ist streng klobig, aber es macht den Job.

library("dplyr") 
df1=tbl_df(df1) 
left_join(df1,left_join(df1%>%select(-Compound),df1%>%group_by(Compound)%>%summarise(unique(Chrom.1.RT)),c("IS.Name"="Compound")))%>%select(-IS.RT)%>%rename(IS.RT=`unique(Chrom.1.RT)`) 

Wenn ich nicht falsch verstanden habe, ist das, was Sie brauchen?

+0

Weitere Details wurden in einem besseren Beispiel und einer vorgeschlagenen Codelösung hinzugefügt. Danke für den Vorschlag! – krazeechemist78

Verwandte Themen