如何将此数据框转换为长格式

how to transform this dataframe to long format

我有一个如下所示的数据框:

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

如何使用 melt 实现此目的?

尝试使用 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")

a 现在看起来像这样:

        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) 访问 "markets"。

Melt 现在的工作方式如下(使用 melt.array 执行重塑):

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