tidy(整洁),Tidyr包是由Hadely Wickham创建,这个包提高了整理原始数据的效率,tidyr包的4个常用的函数及其用途如下:

  • gather()——它把多列放在一起,然后转化为key:value对。这个函数会把宽格式的数据转化为长格式。它是reshape包中melt函数的一个替代
  • spread()——它的功能和gather相反,把key:value对转化成不同的列
  • separate()——它会把一列拆分为多列
  • unite()——它的功能和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

gather()


  • Usage: gather(data, key, value, ..., na.rm = FALSE, convert = FALSE, factor_key = FALSE)
    1. data:需要被转换的宽形表
    2. key:将原数据框中的所有列赋给一个新变量key
    3. value:将原数据框中的所有值赋给一个新变量value
    4. …:可以指定哪些列聚到一列中
    5. na.rm:是否删除缺失值
  • 默认将所有列存放到key中,如下例

    > df_gather <- gather(data = df_wide, key = variable, value = value)
    Warning message:
    attributes are not identical across measure variables; they will be dropped
    > df_gather
    variable value
    1 name A
    2 name B
    3 name C
    4 gender F
    5 gender F
    6 gender M
    7 province JS
    8 province SH
    9 province HN
    10 age 18
    11 age 22
    12 age 19
  • 指定需要被聚为一列的字段
    > df_wide %>% gather(key=vars,value=value,gender:age)
    name vars value
    1 A gender F
    2 B gender F
    3 C gender M
    4 A province JS
    5 B province SH
    6 C province HN
    7 A age 18
    8 B age 22
    9 C age 19
  • 上面的代码等价于:df_wide %>% gather(key=vars,value=value,-name)

spread()


  • Usage:spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE, sep = NULL)
    1. data:为需要转换的长形表
    2. key:需要将变量值拓展为字段的变量
    3. value:需要分散的值
    4. fill:对于缺失值,可将fill的值赋值给被转型后的缺失值
  • 功能:将一列分离为多列
  • 示例数据
    > name <- c("A","A","A","B","B")
    > product <- c("P1","P2","P3","P1","P4")
    > price <- c(100,130,55,100,78)
    > df_long <- data.frame(name = name, product = product, price = price)
    > df_long
    name product price
    1 A P1 100
    2 A P2 130
    3 A P3 55
    4 B P1 100
    5 B P4 78
  • 列分离
    > df_long_expand <- spread(data = df_long, key = product, value = price)
    > df_long_expand
    name P1 P2 P3 P4
    1 A 100 130 55 NA
    2 B 100 NA NA 78
  • 被转型后的数据框中存在缺失值,如果想给缺失值传递一个指定值的话,就需要fill参数的作用。

    > spread(data = df_long, key = product, value = price,fill = 0)
    name P1 P2 P3 P4
    1 A 100 130 55 0
    2 B 100 0 0 78

separate()


  • Usage:separate(data, col, into, sep = "[^[:alnum:]]+", remove = TRUE,convert = FALSE, extra = "warn", fill = "warn", ...)
    1. data:为数据框
    2. col:需要被拆分的列
    3. into:新建的列名,为字符串向量
    4. sep:被拆分列的分隔符
    5. remove:是否删除被分割的列
  • 示例数据

    > id <- c(1,2)
    > datetime <- c(as.POSIXlt("2015-12-31 13:23:44"), as.POSIXlt("2016-01-28 21:14:12"))
    > df <- data.frame(id = id, datetime = datetime)
    > df
    id datetime
    1 1 2015-12-31 13:23:44
    2 2 2016-01-28 21:14:12
  • 使用separate()函数将日期时间值分割为年、月、日、时、分、秒
    > #拆成日期和时间
    > separate1 <- separate(df,col="datetime",into=c("date","time"),sep=" ",remove=FALSE)
    > separate1
    id datetime date time
    1 1 2015-12-31 13:23:44 2015-12-31 13:23:44
    2 2 2016-01-28 21:14:12 2016-01-28 21:14:12
    >
    > separate2 <- separate(separate1,col="date",into=c("year","month","day"),sep="-",remove=FALSE)
    > separate2
    id datetime date year month day time
    1 1 2015-12-31 13:23:44 2015-12-31 2015 12 31 13:23:44
    2 2 2016-01-28 21:14:12 2016-01-28 2016 01 28 21:14:12
    >
    > separate3 <- separate(separate2,col="time",into=c("hh","mm","ss"),sep=":",remove=TRUE)
    > separate3
    id datetime date year month day hh mm ss
    1 1 2015-12-31 13:23:44 2015-12-31 2015 12 31 13 23 44
    2 2 2016-01-28 21:14:12 2016-01-28 2016 01 28 21 14 12l
  • 连接串写法

    > df %>% separate(.,col="datetime",into=c("date","time"),sep=" ",remove=TRUE) %>% separate(.,col="date",into=c("year","month","day"),sep="-",remove=TRUE)%>% separate(.,col="time",into=c("hh","mm","ss"),sep=":",remove=TRUE)
    id year month day hh mm ss
    1 1 2015 12 31 13 23 44
    2 2 2016 01 28 21 14 12

unite()


  • 与separate()函数相反,它将多列合并为一列
  • Usage: unite(data, col, ..., sep = "_", remove = TRUE)
    1. data:为数据框
    2. col:被组合的新列名称
    3. …:指定哪些列需要被组合
    4. sep:组合列之间的连接符,默认为下划线
    5. remove:是否删除被组合的列
    • 示例

      > df1
      id year month day hh mm ss
      1 1 2015 12 31 13 23 44
      2 2 2016 01 28 21 14 12
      > df1 %>% unite(.,col="date",year,month,day,sep="-")%>% unite(.,col="time",hh,mm,ss,sep=":")%>% unite(.,col="datetime",date,time,sep=" ")
      id datetime
      1 1 2015-12-31 13:23:44
      2 2 2016-01-28 21:14:12

R(8): tidyr的更多相关文章

  1. R语言-tidyr和dplyr

    一.安装和加载 1.安装并加载tidyr和dplyr包 install.packages("tidyr") library(tidyr) install.packages(&quo ...

  2. R语言进行数据预处理wranging

    R语言进行数据预处理wranging li_volleyball 2016年3月22日 data wrangling with R packages:tidyr dplyr Ground rules ...

  3. R语言进行数据预处理

    R语言进行数据预处理wranging li_volleyball 2016年3月22日 data wrangling with Rpackages:tidyr dplyr Ground rules l ...

  4. [原]CentOS7安装Rancher2.1并部署kubernetes (二)---部署kubernetes

    ##################    Rancher v2.1.7  +    Kubernetes 1.13.4  ################ ##################### ...

  5. 利用python进行数据分析2_数据采集与操作

    txt_filename = './files/python_baidu.txt' # 打开文件 file_obj = open(txt_filename, 'r', encoding='utf-8' ...

  6. Django项目:CRM(客户关系管理系统)--81--71PerfectCRM实现CRM项目首页

    {#portal.html#} {## ————————46PerfectCRM实现登陆后页面才能访问————————#} {#{% extends 'king_admin/table_index.h ...

  7. R语言中的数据处理包dplyr、tidyr笔记

    R语言中的数据处理包dplyr.tidyr笔记   dplyr包是Hadley Wickham的新作,主要用于数据清洗和整理,该包专注dataframe数据格式,从而大幅提高了数据处理速度,并且提供了 ...

  8. R语言数据处理包dplyr、tidyr笔记

    dplyr包是Hadley Wickham的新作,主要用于数据清洗和整理,该包专注dataframe数据格式,从而大幅提高了数据处理速度,并且提供了与其它数据库的接口:tidyr包的作者是Hadley ...

  9. 【翻译】Awesome R资源大全中文版来了,全球最火的R工具包一网打尽,超过300+工具,还在等什么?

    0.前言 虽然很早就知道R被微软收购,也很早知道R在统计分析处理方面很强大,开始一直没有行动过...直到 直到12月初在微软技术大会,看到我软的工程师演示R的使用,我就震惊了,然后最近在网上到处了解和 ...

随机推荐

  1. JAVA并行程序基础

    JAVA并行程序基础 一.有关线程你必须知道的事 进程与线程 在等待面向线程设计的计算机结构中,进程是线程的容器.我们都知道,程序是对于指令.数据及其组织形式的描述,而进程是程序的实体. 线程是轻量级 ...

  2. forget word _a

    forget word a~   一再,铺音前     1● ab 2● ac 3● ad 4● af 5● ag 6● an 7● as 8● at 9● ap 10● ar

  3. MySQL|RESTRICT|NO ACTION|CASCADE| SET NULL四种外键约束

    外键约束比较多得两种情况: 1.父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败: ON UPDATE CASCADE ON DELETE RESTRICT 1 2.父表更新时子表也更新, ...

  4. python3 scrapy 爬取腾讯招聘

    安装scrapy不再赘述, 在控制台中输入scrapy startproject tencent 创建爬虫项目名字为 tencent 接着cd tencent 用pycharm打开tencent项目 ...

  5. js常用用途

     页面元素查找 查找元素方法表达式                                                 返回值                            依据元 ...

  6. web.xml的分析

    <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.1" ...

  7. Ansible之roles介绍

    本节内容: 什么场景下会用roles? roles示例 一.什么场景下会用roles? 假如我们现在有3个被管理主机,第一个要配置成httpd,第二个要配置成php服务器,第三个要配置成MySQL服务 ...

  8. Apache Tomcat/6.0.39如何配置连接mysql,JDBC:mysql-connector-java-5.1.30-bin.jar-成功连接心得

    http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html 前提:开启TOMCAT,MYsql MySQL ...

  9. SWIFT Scan QRCode

    SWIFT中扫描QRCode代码如下,照着敲一次再看下API的注释应该就没问题了. import UIKit import Foundation import AVFoundation class V ...

  10. Vue.js更改调试地址端口号

    Vue项目一般使用自带的脚手架工具vue-cli和webpack打包方式进行项目构建运行.开发中,我们在控制台输入命令行npm run dev部署项目后,默认开启的页面调试地址是8080端口.但是有时 ...