分享

R语言长数据和短数据相互转换

 萌小芊 2018-05-17

    长数据和短数据的转换在整理数据中是蛮重要的。reshape2包cast函数和tidyr包spread函数将长数据转成宽数据,reshape2包中melt函数和tidyr包gather函数将短数据转成长数据。

    cast函数有dcast和acast,前者是转换为data.frame,后者是转换为array或者matrix。主要用法是:cast(data,formula,fun),这里data就是需要转换的长数据,formula的格式是rowvar1+rowvar2+....~colvar1+colvar2+........,fun的默认函数是length,如果没有fun,输出的是原本的value。

    spread的用法是spread(data,key,value,fill=),data是需要转换的长数据,key是将该列的变量值转换为短数据的变量名,value是指长数据的value列的值来填充短数据各列(value只能是单个变量),fill=NA是将缺失值传递一个指定值。

    melt的用法是melt(data,id.vars,measure.vars,variable.name),data是需要转换的短数据,id.vars是行变量,measure.vars是列变量,variable.name是对长数据的新变量赋名字。

   gather的用法是gather(data,key,value,...),data是需要转换的短数据,key是将短数据转换的列名赋值给一个新变量的名字,value是短数据转换的列的具体值赋值给一个新变量的名字,...中还可以写上需要转换的列。


下面给出一个实例。数据一共有45个观测,6个变量,X00-X03是一天四次的测量值。

代码块

library(data.table)
library(reshape2)
library(tidyr)
shuju<>'C:\\Users\\lenovo\\Desktop\\shuju.csv')
shuju<>-1]
################将长数据转成短数据
#tidyr包中spread
spread_data<>
for(i in 0:3){
 fun<>
spread_data<>1:2,i+3)],key='測項',value=paste('X0',i,sep=''))
}
spread_data<>
}

##reshape2包中cast
cast_data<>
for(i in 1:4){
 fun<>
cast_data<>1:2,i+2)],日期~測項)
 }
 cast_data<>
}

#########将短数据转成长数据
###tidyr包中gather
#因为原数据中每一天有测量四次的数据,转换成长数据之前先排序
spread_data_sort<>
gather_data1<>1,5,9),],测项,X00,-日期)
gather_data2<>2,6,10),],测项,X01,-日期)
gather_data3<>3,7,11),],测项,X02,-日期)
gather_data4<>4,8,12),],测项,X03,-日期)
gather_data<>

#####reshape2包中melt
melt_data1<>1,5,9),],id='日期',value.name = 'X00')
melt_data2<>2,6,10),],id='日期',value.name = 'X01')
melt_data3<>3,7,11),],id='日期',value.name = 'X02')
melt_data4<>4,8,12),],id='日期',value.name = 'X03')
melt_data<>


如果需要代码中的shuju.csv,可以留下你的邮箱~~~~~~~~

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多