R语言数据集行列互换技巧

Python012

R语言数据集行列互换技巧,第1张

R语言数据集行列互换技巧现在给大家介绍的数据处理技巧是长转宽,也就相当于Excel中的转置,不过用R语言实现的长转宽还有数据合并的功能,自然比Excel强大多了。这里给大家介绍4个函数,其中melt()、dcast()来自reshape2包,gather()、spread()来自tidyr包一、宽转长——melt()、gather()[python] view plain copymydata<-data.frame(name=c("store1","store2","store3","store4"),address=c("普陀区","黄浦区","徐汇区","浦东新区"),sale2014=c(3000,2500,2100,1000),sale2015=c(3020,2800,3900,2000),sale2016=c(5150,3600,2700,2500),sale2017=c(4450,4100,4000,3200) ) #宽转长——melt mydata1<-melt(mydata,id.vars=c("address","name"),#要保留的主字段variable.name = "Year",#转换后的分类字段名称(维度)value.name = "Sale" #转换后的度量值名称 ) 输出结果[python] view plain copy>mydata1<-melt( + mydata, + id.vars=c("address","name"),#要保留的主字段 + variable.name = "Year",#转换后的分类字段名称(维度) + value.name = "Sale" #转换后的度量值名称 + ) >mydata1 address name Year Sale 1普陀区 store1 sale2014 3000 2黄浦区 store2 sale2014 2500 3徐汇区 store3 sale2014 2100 4 浦东新区 store4 sale2014 1000 5普陀区 store1 sale2015 3020 6黄浦区 store2 sale2015 2800 7徐汇区 store3 sale2015 3900 8 浦东新区 store4 sale2015 2000 9普陀区 store1 sale2016 5150 10 黄浦区 store2 sale2016 3600 11 徐汇区 store3 sale2016 2700 12 浦东新区 store4 sale2016 2500 13 普陀区 store1 sale2017 4450 14 黄浦区 store2 sale2017 4100 15 徐汇区 store3 sale2017 4000 16 浦东新区 store4 sale2017 3200 再来看看gather()函数怎么用[python] view plain copy>#宽转长——gather >mydata1<-tidyr::gather( + data=mydata, + key="Year", + value="sale", + sale2014:sale2017 + ) >mydata1 name address Year sale 1 store1 普陀区 sale2014 3000 2 store2 黄浦区 sale2014 2500 3 store3 徐汇区 sale2014 2100 4 store4 浦东新区 sale2014 1000 5 store1 普陀区 sale2015 3020 6 store2 黄浦区 sale2015 2800 7 store3 徐汇区 sale2015 3900 8 store4 浦东新区 sale2015 2000 9 store1 普陀区 sale2016 5150 10 store2 黄浦区 sale2016 3600 11 store3 徐汇区 sale2016 2700 12 store4 浦东新区 sale2016 2500 13 store1 普陀区 sale2017 4450 14 store2 黄浦区 sale2017 4100 15 store3 徐汇区 sale2017 4000 16 store4 浦东新区 sale2017 3200 和melt()函数不同,gather()函数需要指定关键字段key,以及关键字段对应的值value,但是gather()函数更加好理解。二、长转宽——dcast()和spread()还是用上面的data1数据集,先来看看dcast()函数[python] view plain copy#长转宽——dcast dcast(data=mydata1,name+address~Year#左侧是要保留的字段,右侧是要分割的分类变量,列数等于表达式#右侧分类变量的类别个数 ) [python] view plain copy>#长转宽——dcast >dcast( + data=mydata1, + name+address~Year + #左侧是要保留的字段,右侧是要分割的分类变量,列数等于表达式 + #右侧分类变量的类别个数 + ) Using sale as value column: use value.var to override. name address sale2014 sale2015 sale2016 sale2017 1 store1 普陀区 3000 3020 5150 4450 2 store2 黄浦区 2500 2800 3600 4100 3 store3 徐汇区 2100 3900 2700 4000 4 store4 浦东新区 1000 2000 2500 3200 dcast()函数的使用规则需要琢磨下才能理解,大家好好看看注释部分,再来看看spread()[python] view plain copy#长转宽——spread tidyr::spread(data=mydata1,key=Year,value=sale ) [python] view plain copy>#长转宽——spread >tidyr::spread( + data=mydata1, + key=Year, + value=sale + ) name address sale2014 sale2015 sale2016 sale2017 1 store1 普陀区 3000 3020 5150 4450 2 store2 黄浦区 2500 2800 3600 4100 3 store3 徐汇区 2100 3900 2700 4000 4 store4 浦东新区 1000 2000 2500 3200 直接调用tidyr::spread,需要指定关键字段key和对应的值value。但是从理解上来看,我个人更喜欢tidyr包的函数,使用很清晰,大家可以根据实际情况自行选择,好啦,今天的分享结束,下次再见!

System.currentTimeMillis() :返回当前系统的毫秒数,由于取得的是毫秒数,所以在处理UNIX时间戳的时候需要转换成秒

也就是:

long epoch = System.currentTimeMillis()/1000

方法:

1、获取当前系统的UNIX时间戳

System.out.println("获取系统毫秒数方法1:"+Long.toString(new Date().getTime()))

System.out.println("获取系统毫秒数方法2:"+Long.toString(System.currentTimeMillis()))

注意:以上代码获取的都是系统毫秒数,在实际的操作中我们一般都是记录毫秒说以求记录的精度,当处理UNIX时间戳的时候需要把数据进行处理。

2、将UNIX时间戳转换成系统可以处理的时间

System.out.println(""+new java.text.SimpleDateFormat("yyyy MM-dd HH:mm:ss").format(new java.util.Date (1215782027390L)))

输出:2008 07-11 21:13:47

注意:此时处理的数据为系统毫秒不是UNIX时间戳

3、讲时间转换成UNIX时间戳

long epoch = new java.text.SimpleDateFormat ("dd/MM/yyyy HH:mm:ss").parse("09/22/2008 16:33:00").getTime()

注意:

请注意!对与不同的时区处理上有差异,首先要清楚自己所在的时区。

String timezone_info = System.getProperty("user.timezone")

System.out.println("当前的时区:"+timezone_info)

System.out.println("时区信息:"+TimeZone.getDefault())

输出:

当前的时区:Asia/Shanghai

时区信息:sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null]

处理不同的时区的方法:

SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")

sd.setTimeZone(TimeZone.getTimeZone("GMT+8"))

String strDate = sd.format(new Date(1215782027390L))

System.out.println("正八区当前时间:"+strDate)

输出:

正八区当前时间:2008-07-11 21:13:47

Excel数据透视表是一种数据汇总手段,如果表格内的数据太多,单靠肉眼是很难准确分辨数据的,而使用数据透视表,就可以很方便的筛选各种数据。可以用在记录数量众多、以流水帐形式记录、结构复杂的工作表。

用R实现数据的透视功能可以使用reshape2包中的melt()函数和dcast()函数,具体操作如下。

1、首先我们需要准备好一个需要做成透视功能表的数据集,如下数据集b。

2、假设希望统计以V1分组,每一组的V4变量各指标的计数,在Excel的透视表里我们需要这样做,如下图列为v4。

3、行标签为v1得到值1,2,3,数字项是列v4中的数值,excel表格中用拖拽行列的方式透视数据这里用赋值。

4、而在R中要达到同样效果需要输出Data.frame格式,dcast函数需要载入reshape2包,如下图1-3行代码,下图4-5行为透视后数据效果。

参考资料来源:百度百科-数据透视表