重塑数据帧并添加列索引

时间:2016-05-07 01:58:36

标签: r reshape reshape2 melt

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

df = 
           b   e   t   w   e   e   n
    [1,] 219 125 125  94 172 109 172
    [2,]  78  78 250 156 172 141 140
    [3,] 250 204 296 829 265 125 203
    [4,] 406 110 172 187  63 156 109

当我融化它时,使用熔体(df),我得到:

df.m = 
   X1 X2 value
1   1  b   219
2   2  b    78
3   3  b   250
4   4  b   406
5   1  e   125
6   2  e    78
7   3  e   204
8   4  e   110
9   1  t   125
10  2  t   250
11  3  t   296
12  4  t   172
13  1  w    94
14  2  w   156
15  3  w   829
16  4  w   187
17  1  e   172
18  2  e   172
19  3  e   265
20  4  e    63
21  1  e   109
22  2  e   141
23  3  e   125
24  4  e   156
25  1  n   172
26  2  n   140
27  3  n   203
28  4  n   109

问题是,当我想制作每个字母的箱线图时,它只是按字母分组。在上面的示例中,有3个" e" s,它们聚集在一起。因此,下面的公式产生下面的箱形图:

ggplot(df.m, aes(x=X2, y=value)) + 
geom_boxplot(outlier.shape=NA) + 
xlim('b','e','t','w','e','e','n')

enter image description here

如果我可以在保留初始列索引的熔化数据框中添加一列,则可以很容易地制作正确的箱形图。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

一个选项是基于“1”创建一个新列(假设数据集为order ed)以获取逻辑向量,获取累积和,转换为字符('i1') ,然后使用OP ggplot的代码,最后用scale_x_discrete更改刻度标记。

library(dplyr)
library(ggplot2)
df.m %>% 
  mutate(i1 = as.character(cumsum(X1==1))) %>%
  ggplot(., aes(x=i1, y= value))+
        geom_boxplot(outlier.shape=NA) +
        scale_x_discrete(breaks= c("1", "2", "3", "4", "5", "6", "7"), 
                         labels= c("b", "e", "t", "w", "e", "e", "n"))+
        xlab(NULL)

enter image description here

或者我们可以将原始matrix中的列名称设置为列{?1}},并直接在melt上使用

ggplot

数据

library(reshape2)
`colnames<-`(df, seq_len(ncol(df))) %>% 
          melt() %>% 
          ggplot(., aes(x=as.character(Var2), y= value)) + 
              geom_boxplot(outlier.shape=NA) + 
              scale_x_discrete(breaks = seq_len(ncol(df)), 
                               labels = colnames(df)) + 
              xlab(NULL)

答案 1 :(得分:1)

使用基本R绘图的另一种解决方案:

boxplot(df)

enter image description here