前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R中的stack和unstack函数

R中的stack和unstack函数

作者头像
生信交流平台
发布2020-09-22 11:14:01
5.3K0
发布2020-09-22 11:14:01
举报
文章被收录于专栏:用户7627119的专栏

我们用R做数据处理的时候,经常要对数据的格式进行变换。例如将数据框(dataframe)转换成列表(list),或者反过来将列表转换成数据框。那么今天小编就给大家介绍一对R函数来实现这样的功能。

这一对函数就叫做stackunstack。从字面意思上来看就是堆叠和去堆叠,就像下面这张图展示的这样。

那么R里面这两个函数具体可以实现什么样的功能呢?下面这张图可以帮助大家来理解。unstack就是根据数据框的第二列的分组信息,将第一列的数据划分到各个组,是一个去堆叠的过程。而stack刚好是一个相反的过程。

一、unstack

下面我们来看几个具体的例子

例如现在我们手上有一个数据框,里面的数据来自PlantGrowth

我们可以先看看PlantGrowth 中的内容,第一列是重量,第二列是不同的处理方式,可以看作是一个分类的变量。

代码语言:javascript
复制
> 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的效果

代码语言:javascript
复制
df = PlantGrowth 
unstacked_df = unstack(df) 
unstacked_df

结果如下,因为这里ctrl,trt1和trt2中的样本刚好都是10个,所以这里结果看上去还像是一个数据框,但是当group这个分组变量里面,每组的数目不一样的时候,你就会发现结果其实是一个列表。

代码语言:javascript
复制
   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一下,你就会发现区别了

代码语言:javascript
复制
df<-PlantGrowth 
unstacked_list = (unstack(df[1:25,]))
unstacked_list

结果如下

代码语言:javascript
复制
$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的反向操作。

代码语言:javascript
复制
stacked_df = stack(unstacked_df)
#修改列名
names(stacked_df)=c("weight","group")
stacked_df

结果如下,这里stack之后列名可以自己再通过names(stacked_df)修改一下

代码语言:javascript
复制
   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函数的时候,也可以对组进行操作,比如筛选和过滤

代码语言:javascript
复制
stacked_df1 = stack(unstacked_df, select = -ctrl) 
stacked_df1

这段代码就在stack的时候去掉了ctrl组,得到的结果如下,就只剩下trt1和trt2这两个组了。

代码语言:javascript
复制
   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

今天的理论部分就先分享到这里,后面小编会使用这两个函数来给大家举个真实的应用案例,敬请期待。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信交流平台 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档