2014-09-15 4 views
0

Я использую пакет data.table для чтения (fread) больших файлов с диска. Считанные data.table выглядитR: Конвертировать N * M data.frame (или data.table) в (N * m) * 3 data.frame

C1, C2, C3 
R1 0.5, 0.9, 0.1 
R2 0.7, 0.1, 0,1 
R3 0.2, 0.3, 0,5 

Но, по вопросам сканирования, я хотел бы иметь их в виде:

R1, C1, 0.5 
R1, C2, 0.9 
R1, C3, 0.1 
R2, C1, 0.7 

Итак, есть эффективный способ сделать это? При использовании rbind, cbind и т. Д. Это берет навсегда. Файлы, которые я читаю, имеют ~ 500 тыс. Строк ~ 100 столбцов.

С наилучшими пожеланиями,

Марио

+7

'help (" melt.data.table ")' – Roland

ответ

2

Чтобы сохранить строки, если нужно:

Начиная с dataframe:

dt = data.frame(c1=c(0.5,0.7,0.2), c2=c(0.9,0.1,0.3), c3=c(0.1,0.1,0.5)) 
row.names(dt) = c("R1","R2","R3") 
melt(as.matrix(dt)) 

Начиная с data.table, вы не можете получить только rowlines:

dt = data.frame(c1=c(0.5,0.7,0.2), c2=c(0.9,0.1,0.3), c3=c(0.1,0.1,0.5)) 
melt(as.matrix(dt)) 
+0

Раствор был правильным намеком, спасибо. Не знал об этом. – mariodeng

+3

Странно, хотя этот ответ был одобрен и принят, это не имеет смысла - 'data.table' не имеют 'rownames', поэтому' as.matrix' просто замедляет работу. .. – A5C1D2H2I1M1N2O1R2T1

+0

Было бы разумно, если бы они прочитали данные как 'data.frame'. – A5C1D2H2I1M1N2O1R2T1

Смежные вопросы