2013-07-30 3 views
6

Есть ли способ в R для преобразования столбцов в строки, сохраняющие имя столбца?Преобразование столбцов в строки, сохраняющие имя столбца

Пример входных данных:

A B 
1 1 
2 3 
3 4 
44 5 

Выход

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

терминов Что поиск у вас попробовал, прежде чем спрашивать здесь? – Roland

+0

Значки для поиска - это «расплавление», «литье», «изменение», «широкий» и «длинный». –

ответ

9

Я использую 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 

Было интересно посмотреть тесты. melt выводит сообщение по умолчанию, которое мы можем отключить, будучи более явным при вызове функции.

> 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 

Я считаю, разница небольшая, и она становится все меньше при печати на melt выключен. Похоже на то, что моя догадка о том, чтобы отключить многословный режим в моих симуляциях, возможно, помогла.

> 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

Нет необходимости использовать reshape2, вы можете использовать stack функцию из базового R:

С your.data в качестве примера:

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

дает вам

> 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 

См. Также here.


Бенчмаркинг melt из reshape2 и stack от основания на больших данные:

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 

Похож stack быстрее, но с разницей в 20 миллисекунд ...

+0

@Thomas, было бы полезно также отредактировать бенчмаркинг в сообщении (желательно с большими данными). – Arun

+0

@Thomas, кажется, не так быстро ... по крайней мере с этим размером данных. – Arun

+0

Если вы имеете в виду, выполнив «system.time», то да, это очень вероятно, будет непоследовательным. – Arun

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