第15天 tidyr包,R语言数据整理又一利器 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包,可以大大省去不少时间。 最后,一个月就能学会R语言,你敢挑战一下吗? 想挑战的话,请加入R语言的交流群吧?(由于群规模限制,请先加入郑老师微信号:扫描以下二维码,并注明R语言)
|
|