必威-必威-欢迎您

必威,必威官网企业自成立以来,以策略先行,经营致胜,管理为本的商,业推广理念,一步一个脚印发展成为同类企业中经营范围最广,在行业内颇具影响力的企业。

对于较为复杂的数据可以这样做,长形表就是一

2019-09-20 17:23 来源:未知

melt函数能够将宽数据转载为长数据

excel数据下载地址:百度云:http://pan.baidu.com/s/1eRPPgL8
导入Excel数据集
install.packages("readxl")
library(readxl)
order <- read_excel("global-superstore.xlsx","订单")

tidy(整洁),Tidyr包是由Hadely 威克汉姆创设,那几个包升高了整治原始数据的效能,tidyr包的4个常用的函数及其用途如下:

最近几年一向在攻读pandas,用到的reshape相关的函数非常多,总计一下,方便未来翻看。

dcast函数能够将长数据转载为宽数据

> DT = fread("melt_default.csv")> DT   family_id age_mother dob_child1 dob_child2 dob_child31:         1         30 1998-11-26 2000-01-29         NA2:         2         27 1996-06-22         NA         NA3:         3         26 2002-07-11 2004-04-05 2007-09-024:         4         32 2004-10-10 2009-08-27 2012-07-215:         5         29 2000-12-05 2005-02-28         NA> DT.m1 <- melt(DT, measure.vars = c("dob_child1", "dob_child2", "dob_child3"),+               variable.name = "child", value.name = "dob")> DT.m1    family_id age_mother      child        dob 1:         1         30 dob_child1 1998-11-26 2:         2         27 dob_child1 1996-06-22 3:         3         26 dob_child1 2002-07-11 4:         4         32 dob_child1 2004-10-10 5:         5         29 dob_child1 2000-12-05 6:         1         30 dob_child2 2000-01-29 7:         2         27 dob_child2         NA 8:         3         26 dob_child2 2004-04-05 9:         4         32 dob_child2 2009-08-2710:         5         29 dob_child2 2005-02-2811:         1         30 dob_child3         NA12:         2         27 dob_child3         NA13:         3         26 dob_child3 2007-09-0214:         4         32 dob_child3 2012-07-2115:         5         29 dob_child3         NA> dcast(DT.m1, family_id + age_mother ~ child, value.var = "dob")   family_id age_mother dob_child1 dob_child2 dob_child31:         1         30 1998-11-26 2000-01-29         NA2:         2         27 1996-06-22         NA         NA3:         3         26 2002-07-11 2004-04-05 2007-09-024:         4         32 2004-10-10 2009-08-27 2012-07-215:         5         29 2000-12-05 2005-02-28         NA

张开excel查占卜应数据

  • gather()——它把多列放在一齐,然后转向为key:value对。这么些函数会把宽格式的数额转载为长格式。它是reshape包中melt函数的一个代表
  • spread()——它的效率和gather相反,把key:value对转化成不一致的列
  • separate()——它会把一列拆分为多列
  • unite()——它的功力和separate相反,把多列合併为一列

1. padnas.melt(frame,id_vars,value_vars,...)

文档中说:“Unpivots” a DataFrame from wide format to long format, optionally leaving identifier variables set.说白了便是将宽数据格式转为长数据格式
上面先看看多少个根本参数(parameter):

frame:即需求中转数据形式的多寡
id_vars:有个id,就要作为标志列的那一列数据
value_vars:即需求转移的列名字。

    '''官网小例子'''
    >>>import pandas as pd
    >>>df=pd.DataFrame({'A':{0:'a',1:'b',2:'c'},
                        'B':{0:1,1:3,2:5},
                        'C':{0:2,1:4,2:6}})
    >>>df
        A    B    C
     0  a    1    2
     1  b    3    4
     2  c    5    6
    >>>pd.melt(df,id_vars=['A'],value_vars=['B'])
    '''即将A列作为ID列,将B列列名转为第二列的值,第三列即为对应的原B列的值。'''
        A     variable    value
      0 a        B        1
      1 b        B        3
      2 c        B        5

对此相比复杂的数据能够这么做

> DT <- fread("melt_enhanced.csv")> DT   family_id age_mother dob_child1 dob_child2 dob_child3 gender_child1 gender_child2 gender_child31:         1         30 1998-11-26 2000-01-29         NA             1             2            NA2:         2         27 1996-06-22         NA         NA             2            NA            NA3:         3         26 2002-07-11 2004-04-05 2007-09-02             2             2             14:         4         32 2004-10-10 2009-08-27 2012-07-21             1             1             15:         5         29 2000-12-05 2005-02-28         NA             2             1            NA> DT.m2 <- melt(DT, measure = patterns("^dob","^gender"), value.name = c("dob", "gender"))> DT.m2    family_id age_mother variable        dob gender 1:         1         30        1 1998-11-26      1 2:         2         27        1 1996-06-22      2 3:         3         26        1 2002-07-11      2 4:         4         32        1 2004-10-10      1 5:         5         29        1 2000-12-05      2 6:         1         30        2 2000-01-29      2 7:         2         27        2         NA     NA 8:         3         26        2 2004-04-05      2 9:         4         32        2 2009-08-27      110:         5         29        2 2005-02-28      111:         1         30        3         NA     NA12:         2         27        3         NA     NA13:         3         26        3 2007-09-02      114:         4         32        3 2012-07-21      115:         5         29        3         NA     NA> DT.c2 <- dcast(DT.m2, family_id + age_mother ~ variable, value.var = c("dob","gender"))> DT.c2   family_id age_mother      dob_1      dob_2      dob_3 gender_1 gender_2 gender_31:         1         30 1998-11-26 2000-01-29         NA        1        2       NA2:         2         27 1996-06-22         NA         NA        2       NA       NA3:         3         26 2002-07-11 2004-04-05 2007-09-02        2        2        14:         4         32 2004-10-10 2009-08-27 2012-07-21        1        1        15:         5         29 2000-12-05 2005-02-28         NA        2        1       NA

图片 1

长形表和宽形表,简单的讲,长形表正是一个旁观对象可由多行组成,而宽形表则是一个观测仅由一行组成。

2. pd.DataFrame.stack(level,dropna=True)

DataFrame方法,张开列标签的三个档期的顺序,重回贰个DataFrame对象,若独有一层标签,则赶回Series,作用和melt函数相似,可是越来越多的用来含有MultiIndex数据,但将点名等级次序的目录全都展开,并不能够象melt一样指定张开哪些列。

参数:
level:档次索引的层级,详见MultiIndex章节。从0开端分别对应首先层等索引,若为-1,则象征最里面一层索引。

s a b one 1. 2. two 3. 4. s.stack() one a 1 b 2 two a 3 b 4

Paste_Image.png

初始

3. pandas.DataFrame.unstack(level=-1,fill_value=None)

unstack类似于stack的逆进程。旋转叁个索引标签,由长数据转为宽数据,再次来到DataFrame对象,假设索引不死MultiIndex,则赶回Series。

参数:
level:同stack
fill_value:在长数据转为宽数据时,有十分大大概爆发NaN值,假如爆发了,则用fill_value的值替代。
注意:索引中不可能冒出重复值,不然将会报错:ValueError: Index contains duplicate entries, cannot reshape

s one a 1.0 b 2.0 two a 3.0 b 4.0 s.unstack(level=-1) a b one 1.0 2.0 two 3.0 4.0

正文将演示tidyr包中下述八个函数的用法:


  • gather—宽数据转为长数据。类似于reshape2包中的melt函数
  • spread—长数据转为宽数据。类似于reshape2包中的cast函数
  • unit—多列合併为一列
  • separate—将一列分别为多列
  • 安装载入包

    install.packages("tidyr")
    library(tidyr)
    
  • 团伙数量

    > name <- c("A","B","C")
    > gender <- c("F","F","M")
    > province <- c("JS","SH","HN")
    > age <- c(18,22,19)
    > df_wide <- data.frame(name = name, gender = gender, province = province, age = age)
    > df_wide
      name gender province age
    1    A      F       JS  18
    2    B      F       SH  22
    3    C      M       HN  19
    
  •  

separate()

1.orderid由三有的构成,今后亟待领收取分销中央代码center
orders0 <- order %>% separate(col = orderid,into=c("center","year","product"),sep="-")

图片 2

Paste_Image.png

原数据为:

图片 3

Paste_Image.png

2.将市镇和地点统10%新的变量 marketarea
orders1 <- order %>%unite(marketarea, market, area, sep='-')

图片 4

Paste_Image.png

原数据为:

图片 5

Paste_Image.png

3.将sales到shipcost之间的变量转变到长数据,别的变量保持不改变。

orders2 <- order %>% gather(attribute, value, sales:shipcost)
为了能精晓看出效果,换一种做法
1.先将sales:shipcost之间的变量提抽出来
new_order <- select(order,sales:shipcost)

图片 6

Paste_Image.png

2.再将宽数据,转化为长数据
orders2 <- new_order %>% gather(attribute, value, sales:shipcost)

图片 7

Paste_Image.png

4.将attribute和value张开成宽数据
orders3 <- orders2 %>% spread(attribute, value)
进展后会插入到数量表末尾,变量依照早先字母排序

未操作

图片 8

Paste_Image.png

宽数据变长数据

图片 9

Paste_Image.png

长数据变宽数据

图片 10

Paste_Image.png

gather()

TAG标签:
版权声明:本文由必威发布于必威-编程,转载请注明出处:对于较为复杂的数据可以这样做,长形表就是一