2016-03-21 22 views
-1

eine Referenztabelle verwendet, Im traying die Daten aus mehreren Spalten in Zeilen neu zu lokalisieren, einige wichtigen Felder (andere Spalten) zu halten.R für Schleife slooow

Name Amplitude A   B   
M2  3.264   29.0  28.98 
S2  0.781   51.9  30.0 
N2  0.63   12.3  28.43 
K1  1.263  136.8  15.04 
M4  0.043  286.0  57.96 

bekam ich eine endgültige Ergebnisse wie folgt aus:

Name Amplitude Value Code   
M2  3.264   29.0 A  
S2  0.781   51.9 A  
N2  0.63   12.3 A  
K1  1.263  136.8 A  
M4  0.043  286.0 B 
M2  3.264  28.98 B 
S2  0.781   30.0 B 
N2  0.63   15.04 B 
K1  1.263  57.96 B 

Dies ist nur ein Beispiel, das ich mehr Spalten von Amplitude zu A in der ersten Tabelle haben. Ich verwende den folgenden Code ein:

Final<-NULL 

colname<-colnames(ReferenceAll) 

for (i in (1:nrow(ReferenceAll))){ 
    for (j in (1:ncol(ReferenceAll))){ 
    if (j>2) { # the number is from the column I want to get in the results 

    temp<-as.data.frame(rbind(cbind(Name=ReferenceAll[i,1], 
            Amplitude=as.character.factor(ReferenceAll[i,2]), 
            Value=ReferenceAll[i,j], 
            Code=colname[j]))) 
    Final<-rbind(Final,temp)}}} 

Wenn ich einige Zeilen haben es dauert miliseconds aber wenn ich mehr als 100 Zeilen haben es dauert Stunden. Kann mir jemand helfen?

+2

'Bibliothek (reshape2), Schmelz (DF1, id.vars = c ("Name", "Amplitude"), value.name = "Wert", variable.name = "Code")' – RHertel

+1

Basis R: 'reshape (df, variierend = c ("A", "B"), direction = "long", v.names = c ("Value"), mal = c ("A", "B")) ' – Zelazny7

Antwort

3

Wir melt von data.table verwenden. Es sollte schnell verglichen mit der for Schleife sein.

library(data.table) 
melt(setDT(df1), id.var=1:2, value.name="Value", variable.name="Code")