2015-11-29 3 views
0

У меня есть dataframe глядя, как это:, как превратить этот dataframe в длинном формате

a <- c("Lilo","Chops","Henmans") 
a <- cbind(a,c(0.1,0.5,0.25),c(0.2,0.3,0.65),c(0.7,0.2,0.1)) 
colnames(a) <- c("market","Product A","Product B","Product C") 

и хотели бы, чтобы расплавить его:

b <- melt(a, varnames = c("market")) 

это дает следующее:

> b 
    market  NA value 
1  1 market Lilo 
2  2 market Chops 
3  3 market Henmans 
4  1 Product A  0.1 
5  2 Product A  0.5 
6  3 Product A 0.25 
7  1 Product B  0.2 
8  2 Product B  0.3 
9  3 Product B 0.65 
10  1 Product C  0.7 
11  2 Product C  0.2 
12  3 Product C  0.1 
> 

Тем не менее, хочу, чтобы я искал

> b 
    market  NA value 
4  Lilo Product A 0.1 
5 Chops Product A 0.5 
6 Henmans Product A 0.25 
7  Lilo Product B 0.2 
8 Chops Product B 0.3 
9 Henmans Product B 0.65 
10 Lilo Product C 0.7 
11 Chops Product C 0.2 
12 Henmans Product C 0.1 

Как достичь этого, используя расплав?

+0

значения в не числовой. Причина в том, что в R матрица может сохранять только значения одного типа: так что в вашем случае смешение числового и символьного (столбчатый рынок) делает матричный числовой. Возможно, вы захотите использовать 'data.table' вместо этого. Читайте в своих данных следующим образом: 'DF <- data.frame (c (« Lilo »,« Chops »,« Henmans »), c (0,1,0,5,0,25), c (0,2,0,3,0,65), c (0.7,0.2,0.1)); colnames (DF) <- c («рынок», «продукт A», «продукт B», «продукт C») ' Затем используйте' melt (DF) ' – Rentrop

+2

Это связано http://stackoverflow.com/вопросы/22264737/с использованием расплава-с-матрицей или-данные кадров дают разные-выходы –

ответ

1

Попробуйте использовать rownames вместо отдельной колонки market. Таким образом, вы получите цифровую матрицу, и вы можете использовать melt очень просто следующим образом:

a <- cbind(c(0.1,0.5,0.25),c(0.2,0.3,0.65),c(0.7,0.2,0.1)) 
rownames(a) <- c("Lilo","Chops","Henmans") 
colnames(a) <- c("Product A","Product B","Product C") 

теперь выглядит следующим образом:

 Product A Product B Product C 
Lilo   0.10  0.20  0.7 
Chops  0.50  0.30  0.2 
Henmans  0.25  0.65  0.1 

Вы можете получить доступ к «рынки» с помощью rownames(a).

расплава теперь работает следующим образом (который использует melt.array для выполнения Reshape):

melt(a) 
    Var1  Var2 value 
1 Lilo Product A 0.10 
2 Chops Product A 0.50 
3 Henmans Product A 0.25 
4 Lilo Product B 0.20 
5 Chops Product B 0.30 
6 Henmans Product B 0.65 
7 Lilo Product C 0.70 
8 Chops Product C 0.20 
9 Henmans Product C 0.10