30 天学会R DAY 15:tidyr包,数据整理另外一个利器
卖萌控的博客
点击这里进入电脑版页面!体验更好
30 天学会R DAY 15:tidyr包,数据整理另外一个利器
2022-6-3 萌小白


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包,可以大大省去不少时间。


转自:医学论文与统计分析
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容