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包,可以大大省去不少时间。
转自:医学论文与统计分析- 本文固定链接: https://maimengkong.com/kyjc/964.html
- 转载请注明: : 萌小白 2022年6月3日 于 卖萌控的博客 发表
- 百度已收录