2016-03-21 3 views
-1

Используя ссылочную таблицу, я пытаюсь повторно найти данные из нескольких столбцов в строки, сохраняя некоторые важные поля (другие столбцы).R for loop to 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 

Я получил окончательные результаты, как это:

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 

Это просто пример, у меня есть несколько столбцов от амплитуды до А в первой таблице. Я использую следующий код:

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

Когда у меня есть несколько строк, затрачиваемое миллисекунды, но когда у меня есть более чем 100 строк она занимает несколько часов. Может кто-нибудь мне помочь?

+2

'библиотека (reshape2); расплава (DF1, id.vars = с ("Name", "Амплитуда"), value.name = "Значение", variable.name = "Код")' – RHertel

+1

база R: 'reshape (df, variable = c (" A "," B "), direction =" long ", v.names = c (" Value "), times = c (" A "," B ")) ' – Zelazny7

ответ

3

Мы можем использовать melt от data.table. Он должен быть быстрым по сравнению с циклом for.

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