首页 > 科研教程 > 30 天学会R DAY 15:tidyr包,数据整理另外一个利器
2022
06-03

30 天学会R DAY 15:tidyr包,数据整理另外一个利器

68b882c8842987aab6ff6e6d98bcf5ba.jpeg

tidyr包 用来处理宽数据和长数据,用来进行字符串变量的拆分和合并,在医学大数据领域用的较多,有兴趣的朋友可以了解下。

本文将演示tidyr包中下述四个函数的用法:

1. gather—宽数据转为长数据。

2. spread—长数据转为宽数据。

3. unit—多列合并为一列

4. separate—将一列分离为多列

tidyr包安装及载入

install.packages("tidyr")

library(tidyr)

1. 宽数据转为长数据gather() 函数

首先我们通过一个数据集来解释什么是宽数据。

医学研究宽数据和长数据都很常见,最常见的是医学随访的数据,往往在随访期内,多次策略。

比如,测量郑、陈、毛三人某种治疗药物之后,治疗前、治疗后1周、治疗后2周,治疗后3周的收缩压值。可以得到两种结构的数据库。

第一种,宽数据

> df1<- data.frame(name=c('郑','陈','毛'),

t0=c(170,135,145), t1=c(160,140,137), t2=c(156,133,140), t3=c(160,140,120))

> df1

name t0 t1 t2 t3

1 郑 170 160 156 160

2 陈 135 140 133 140

3 毛 145 137 140 120

每个对象一行数据,t0-t3分别代表治疗前、治疗后1周、治疗后2周,治疗后3周的收缩压值这样的数据为横向增加列的数量,为宽数据。

这样的数据可以通过gathe()函数转为另外一种形式的数据--长数据

使用gather()函数实现宽表转长表,语法如下:

gather(data, key, value, …, na.rm = FALSE, convert = FALSE)

data:需要被转换的宽形表

key:将原数据框中的所有列赋给一个新变量key

value:将原数据框中的所有值赋给一个新变量value

…:可以指定哪些列聚到同一列中

na.rm:是否删除缺失值

### 使用gathe()函数实现宽表转长表####

> df2<-gather(df1,time,SBP, t0,t1,t2,t3) #time为四个时间点,value为收缩压

> df2

name time SBP

1 郑 t0 170

2 陈 t0 135

3 毛 t0 145

4 郑 t1 160

5 陈 t1 140

6 毛 t1 137

7 郑 t2 156

8 陈 t2 133

9 毛 t2 140

10 郑 t3 160

11 陈 t3 140

12 毛 t3 120

上述产生的df2就是第二种数据形式,长数据。新增一个时间变量,收缩压整合成一列。长数据形式在大规模随访数据中更为常见,特别是各个对象随访次数不一样的情况,比如“郑”随访一次,“毛”随访3次,这样的数据结构不整齐,难以用宽数据整理,用长数据更常见。

2. 长转宽:spread()

有时,为了满足建模或绘图的要求,往往需要将长形表转换为宽形表,或将宽形表变为长形表。如何实现这两种数据表类型的转换。使用spread()函数实现长表转宽表,语法如下:

spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE)

data:为需要转换的长形表

key:需要将变量值拓展为字段的变量

value:需要分散的值

fill:对于缺失值,可将fill的值赋值给被转型后的缺失值

> df3<-spread(df2,time,SBP,fill = NA)

> df3

name t0 t1 t2 t3

1 陈 135 140 133 140

2 毛 145 137 140 120

3 郑 170 160 156 160

3 合并:unit()

unit()可以合并不同的变量值,特别是两个字符串变量,可以采用一定的方式进行合并。

unite的调用格式如下:

unite(data, col, …, sep = “_”, remove = TRUE)

data:为数据框

col:被组合的新列名称

…:指定哪些列需要被组合

sep:组合列之间的连接符,默认为下划线

remove:是否删除被组合的列

> df4<-unite(df3,namet0, name,t0, sep= "_",remove=F)

> df4

namet0 name t0 t1 t2 t3

1 陈_135 陈 135 140 133 140

2 毛_145 毛 145 137 140 120

3 郑_170 郑 170 160 156 160

4 拆分:separate()

separate()函数可将一列拆分为多列,一般可用于日志数据或日期时间型数据的拆分。

语法如下:

separate(data, col, into, sep = “ ”, remove = TRUE,

convert = FALSE, extra = “warn”, fill = “warn”, …)

data:为数据框

col:需要被拆分的列

into:新建的列名,为字符串向量

sep:被拆分列的分隔符

remove:是否删除被分割的列

> df5<-separate(df4, namet0, c("name1","t01"), sep = "_", remove = TRUE)

> df5

name1 t01 name t0 t1 t2 t3

1 陈 135 陈 135 140 133 140

2 毛 145 毛 145 137 140 120

3 郑 170 郑 170 160 156 160

可见separate()函数和unite()函数的功能相反。

tidyr包的四种函数,你了解了吗?操作也非常简单。 本人就曾经困恼过长数据和宽数据,比如重复测量方差分析时,SPSS软件采用的数据库是宽数据,SAS的数据库则是长数据。为此,我不得不手工去操作,现在借助tidyr包,可以大大省去不少时间。

转自:医学论文与统计分析

最后编辑:
作者:萌小白
一个热爱网络的青年!

发布评论

表情