2013-07-30 18 views
6

Czy istnieje jakiś sposób w R na Konwertowanie kolumn na wiersze z zachowaniem nazwy kolumny?Konwertowanie kolumn na wiersze z zachowaniem nazwy kolumny

Przykład wkład:

A B 
1 1 
2 3 
3 4 
44 5 

wyjściowy

Group Number 
    A  1 
    A  2 
    A  3 
    A  44 
    B  1 
    B  3 
    B  4 
    B  5 
+1

terminy wyszukiwania Co cię mieć próbował przed pytaniem tutaj? – Roland

+0

Słowa Buzz do wyszukiwania to "topienie", "rzut", "zmiana kształtu", "szeroki" i "długi". –

Odpowiedz

9

użyć reshape2.

> x <- data.frame(A = 1:5, B = 55:51) 
> library(reshape2) 
> melt(x) 
Using as id variables 
    variable value 
1   A  1 
2   A  2 
3   A  3 
4   A  4 
5   A  5 
6   B 55 
7   B 54 
8   B 53 
9   B 52 
10  B 51 

Ciekawie było zobaczyć benchmarki. melt domyślnie drukuje wiadomość, którą możemy wyłączyć, wyraźnie mówiąc podczas wywoływania funkcji.

> microbenchmark(stack(DF), melt(DF), times=100) 
    Unit: milliseconds 
      expr  min  lq median  uq  max neval 
    stack(DF) 122.3086 133.8435 139.6990 180.5338 250.9316 100 
     melt(DF) 140.0183 198.2025 227.8125 245.3444 367.1552 100 

znajdę różnica niewielka, a to staje się mniejsza w przypadku drukowania na melt jest wyłączony. Wygląda na to, że moje przeczenie wyłączania trybu verbose w moich symulacjach mogło pomóc.

> microbenchmark(stack(DF), melt(DF, measure.vars = names(DF)[grepl("X", names(DF))]), times=100) 
Unit: milliseconds 
                 expr  min  lq median  uq  max neval 
               stack(DF) 94.33681 124.9958 132.1747 144.7323 287.7438 100 
melt(DF, measure.vars = names(DF)[grepl("X", names(DF))]) 99.44282 141.0594 150.2625 178.8081 249.0888 100 
10

Nie ma potrzeby korzystania reshape2, można użyć funkcji stack z bazy-R:

Z your.data jako przykład:

res <- stack(your.data) 
colnames(res) = c("Number", "Group") 

daje

> res 
    Number Group 
1  1  A 
2  2  A 
3  3  A 
4  44  A 
5  1  B 
6  3  B 
7  4  B 
8  5  B 

Zobacz także here.


Benchmarking melt z reshape2 i stack z bazy danych na większe:

require(reshape2) 
set.seed(45) 
DF <- data.frame(matrix(sample(20, 1e6, TRUE), ncol=100)) 

require(microbenchmark) 
microbenchmark(stack(DF), melt(DF), times=100) 

Unit: milliseconds 
     expr  min  lq median  uq  max neval 
stack(DF) 157.7084 187.1993 241.8206 251.7132 334.5488 100 
    melt(DF) 174.6079 253.1088 261.6234 273.3971 443.9953 100 

Wygląda stack jest szybszy, ale o wartość 20 milisekund ...

+0

@ Thomas, byłoby również przydatne do edycji testu porównawczego w poście (najlepiej przy większych danych). – Arun

+0

@Thomas, nie wydaje się dwa razy szybciej ... przynajmniej z tym rozmiarem danych. – Arun

+0

Jeśli masz na myśli robienie "system.time", to tak, jest bardzo prawdopodobne, że jest niespójne. – Arun

Powiązane problemy