我们用R做数据处理的时候,经常要对数据的格式进行变换。例如将数据框(dataframe)转换成列表(list),或者反过来将列表转换成数据框。那么今天小编就给大家介绍一对R函数来实现这样的功能。
这一对函数就叫做stack和unstack。从字面意思上来看就是堆叠和去堆叠,就像下面这张图展示的这样。
那么R里面这两个函数具体可以实现什么样的功能呢?下面这张图可以帮助大家来理解。unstack就是根据数据框的第二列的分组信息,将第一列的数据划分到各个组,是一个去堆叠的过程。而stack刚好是一个相反的过程。
一、unstack
下面我们来看几个具体的例子
例如现在我们手上有一个数据框,里面的数据来自PlantGrowth
我们可以先看看PlantGrowth 中的内容,第一列是重量,第二列是不同的处理方式,可以看作是一个分类的变量。
> PlantGrowth
weight group
1 4.17 ctrl
2 5.58 ctrl
3 5.18 ctrl
4 6.11 ctrl
5 4.50 ctrl
6 4.61 ctrl
7 5.17 ctrl
8 4.53 ctrl
9 5.33 ctrl
10 5.14 ctrl
11 4.81 trt1
12 4.17 trt1
13 4.41 trt1
14 3.59 trt1
15 5.87 trt1
16 3.83 trt1
17 6.03 trt1
18 4.89 trt1
19 4.32 trt1
20 4.69 trt1
21 6.31 trt2
22 5.12 trt2
23 5.54 trt2
24 5.50 trt2
25 5.37 trt2
26 5.29 trt2
27 4.92 trt2
28 6.15 trt2
29 5.80 trt2
30 5.26 trt2
接下来我们来看看unstack的效果
df = PlantGrowth
unstacked_df = unstack(df)
unstacked_df
结果如下,因为这里ctrl,trt1和trt2中的样本刚好都是10个,所以这里结果看上去还像是一个数据框,但是当group这个分组变量里面,每组的数目不一样的时候,你就会发现结果其实是一个列表。
ctrl trt1 trt2
1 4.17 4.81 6.31
2 5.58 4.17 5.12
3 5.18 4.41 5.54
4 6.11 3.59 5.50
5 4.50 5.87 5.37
6 4.61 3.83 5.29
7 5.17 6.03 4.92
8 4.53 4.89 6.15
9 5.33 4.32 5.80
10 5.14 4.69 5.26
例如我们取前25行来unstack一下,你就会发现区别了
df<-PlantGrowth
unstacked_list = (unstack(df[1:25,]))
unstacked_list
结果如下
$ctrl
[1] 4.17 5.58 5.18 6.11 4.50 4.61 5.17 4.53 5.33 5.14
$trt1
[1] 4.81 4.17 4.41 3.59 5.87 3.83 6.03 4.89 4.32 4.69
$trt2
[1] 6.31 5.12 5.54 5.50 5.37
二、stack
stack其实是unstack的反向操作。
stacked_df = stack(unstacked_df)
#修改列名
names(stacked_df)=c("weight","group")
stacked_df
结果如下,这里stack之后列名可以自己再通过names(stacked_df)修改一下
weight group
1 4.17 ctrl
2 5.58 ctrl
3 5.18 ctrl
4 6.11 ctrl
5 4.50 ctrl
6 4.61 ctrl
7 5.17 ctrl
8 4.53 ctrl
9 5.33 ctrl
10 5.14 ctrl
11 4.81 trt1
12 4.17 trt1
13 4.41 trt1
14 3.59 trt1
15 5.87 trt1
16 3.83 trt1
17 6.03 trt1
18 4.89 trt1
19 4.32 trt1
20 4.69 trt1
21 6.31 trt2
22 5.12 trt2
23 5.54 trt2
24 5.50 trt2
25 5.37 trt2
26 5.29 trt2
27 4.92 trt2
28 6.15 trt2
29 5.80 trt2
30 5.26 trt2
在使用stack函数的时候,也可以对组进行操作,比如筛选和过滤
stacked_df1 = stack(unstacked_df, select = -ctrl)
stacked_df1
这段代码就在stack的时候去掉了ctrl组,得到的结果如下,就只剩下trt1和trt2这两个组了。
values ind
1 4.81 trt1
2 4.17 trt1
3 4.41 trt1
4 3.59 trt1
5 5.87 trt1
6 3.83 trt1
7 6.03 trt1
8 4.89 trt1
9 4.32 trt1
10 4.69 trt1
11 6.31 trt2
12 5.12 trt2
13 5.54 trt2
14 5.50 trt2
15 5.37 trt2
16 5.29 trt2
17 4.92 trt2
18 6.15 trt2
19 5.80 trt2
20 5.26 trt2
今天的理论部分就先分享到这里,后面小编会使用这两个函数来给大家举个真实的应用案例,敬请期待。