tidyr包的作者是Hadley Wickham。这个包常跟dplyr结合使用。本文将介绍tidyr包中下述四个函数的用法:

  • gather—宽数据转为长数据。类似于reshape2包中的melt函数
  • spread—长数据转为宽数据。类似于reshape2包中的cast函数
  • unit—多列合并为一列
  • separate—将一列分离为多列

1.载入包

# 使用datasets包中的mtcars数据集做演示
library(tidyr)
library(dplyr)
head(mtcars)

# 为方便处理,在数据集中增加一列car
mtcars$car <- rownames(mtcars)
mtcars <- mtcars[, c(, :)]

View(mtcars)

2.gather--宽数据转为长数据

使用gather()函数实现宽表转长表,语法如下:
gather(data, key, value, …, na.rm = FALSE, convert = FALSE)
data:需要被转换的宽形表
key:将原数据框中的所有列赋给一个新变量key
value:将原数据框中的所有值赋给一个新变量value
…:可以指定哪些列聚到同一列中
na.rm:是否删除缺失值

开始使用:

# 除了car列外,其余列聚合成两列,分别命名为attribute和value
mtcarsNew <- mtcars %>% gather(attribute, value, -car)
head(mtcarsNew)

如你所见,除了car列外,其余列聚合成两列,分别命名为attribute和value。tidyr很好的一点是可以只gather若干列而其他列保持不变。如果你想gather在map和gear之间的所有列而保持carb和car列不变,可以像下面这样做:

# gather在map和gear之间的所有列而保持carb和car列不变
mtcarsNew <- mtcars %>% gather(attribute, value, mpg:gear)
head(mtcarsNew)

3.spread--长数据转为宽数据

有时,为了满足建模或绘图的要求,往往需要将长形表转换为宽形表,或将宽形表变为长形表。如何实现这两种数据表类型的转换。使用spread()函数实现长表转宽表,语法如下:

spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE)
data:为需要转换的长形表
key:需要将变量值拓展为字段的变量
value:需要分散的值
fill:对于缺失值,可将fill的值赋值给被转型后的缺失值

使用:

mtcarsSpread <- mtcarsNew %>% spread(attribute, value)
head(mtcarsSpread)
                 car carb  mpg cyl disp  hp drat    wt  qsec vs am gear
        AMC Javelin
 Cadillac Fleetwood
         Camaro Z28
  Chrysler Imperial
         Datsun
   Dodge Challenger               

4.unite--多列合并为一列

unite的调用格式如下:

unite(data, col, …, sep = “_”, remove = TRUE)
data:为数据框
col:被组合的新列名称
…:指定哪些列需要被组合
sep:组合列之间的连接符,默认为下划线
remove:是否删除被组合的列

其作用是将多列合并为一列,举例如下:

# 虚构一些数据
)
date <- :
hour <- sample(:, )
min <- sample(:, )
second <- sample(:, )
)
data <- data.frame(date, hour, min, second, event)
View(data)

# 把date,hour,min和second列合并为新列datetime
# R中的日期时间格式为"Year-Month-Day-Hour:Min:Second"
dataNew <- data %>%
  unite(datehour, date, hour, sep = ' ') %>%
  unite(datetime, datehour, min, second, sep = ':')
View(dataNew)

5.separate--将一列分离为多列

separate()函数可将一列拆分为多列,一般可用于日志数据或日期时间型数据的拆分,语法如下:

separate(data, col, into, sep = “[^[:alnum:]]+”, remove = TRUE,
convert = FALSE, extra = “warn”, fill = “warn”, …)
data:为数据框
col:需要被拆分的列
into:新建的列名,为字符串向量
sep:被拆分列的分隔符
remove:是否删除被分割的列 

举例如下:

# 可以用separate函数将数据恢复到刚创建的时候
# 首先,将datetime分为date列和time列 然后,将time列分为hour,min,second列
data1 <- dataNew %>%
  separate(datetime, c('date', 'time'), sep = ' ') %>%
  separate(time, c('hour', 'min', 'second'), sep = ':')
data1

6.tidyr包0.5.0版本新特性

目前tidyr包已更新至0.5.1版本,接下来简要介绍0.5.0版本中三个有用的新特性:

准备工作:

library('tidyr')
library(tibble)

注:为了保持跟原文一致,本文用的是data.frame的精简版data_frame。需加载tibble包。

三个新特性

(1)separate_rows():通过分隔符将那些含有多个值的字段拆分为多行。

separate_rows(data, ..., sep = "[^[:alnum:].]+", convert = FALSE)
data:数据
...:需要被拆分的列
sep:分隔符

示例操作:

df <- data_frame(x = :,y = c("a,b","d,e,f"));df
df %>% separate_rows(y,sep = ",")

df %>% separate(y,c("y1","y2","y3"),sep = ",",fill = "right")

(2)spread()函数增加了一个sep参数:用于将列名设置为“key|sep|value”格式。这在对字段为数值型数据做重塑时非常有用。

spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE,sep = NULL)
data:为需要转换的长形表
key:需要将变量值拓展为字段的变量
value:需要分散的值
fill:对于缺失值,可将fill的值赋值给被转型后的缺失值
sep:用于将列名设置为“key|sep|value”格式

示例:

df <- data_frame(x = c(,,),
                 key = c(,,),
                 val = c("a","b","c"));df
df %>% spread(key,val)
df %>% spread(key,val,sep = "_")

(3)unnest()函数增加了一个.sep参数。当数据框的多个列包含有相同变量名的时候非常有用:

unnest()嵌套list的列

unnest(data, ..., .drop = NA, .id = NULL, .sep = NULL)
data:数据框
...:要嵌套的列
.id:用于显示列表中定义的名称
.sep:当数据框的多个列包含相同变量名的时候非常有用

使用示例:

df <- data_frame(x = :,
                 y1 = list(data_frame(y = ),data_frame(y = )),
                 y2 = list(data_frame(y = "a"),data_frame(y = "b")))
df
df %>% unnest()
df %>% unnest(.sep = "_")

同时,unnest()函数添加了.id参数用于显示列表中定义的名称:

df <- data_frame(x = :,
                 y = list(a = :,b = :));df
df %>% unnest()
df %>% unnest(.id = "id")

本文链接:http://www.cnblogs.com/homewch/p/5778405.html

tidyr包--数据处理包的更多相关文章

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

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

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

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

  3. 数据处理包plyr和dplyr包的整理

    以下内容主要参照 Introducing dplyr 和 dplyr 包自带的简介 (Introduction to dplyr), 复制了原文对应代码, 并夹杂了个人理解和观点 (多附于括号内). ...

  4. 【TCP协议】(3)---TCP粘包黏包

    [TCP协议](3)---TCP粘包黏包 有关TCP协议之前写过两篇博客: 1.[TCP协议](1)---TCP协议详解 2.[TCP协议](2)---TCP三次握手和四次挥手 一.TCP粘包.拆包图 ...

  5. Socket/TCP粘包、多包和少包, 断包

    转发: https://blog.csdn.net/pi9nc/article/details/17165171 为什么TCP 会粘包 前几天,调试mina的TCP通信, 第一个协议包解析正常,第二个 ...

  6. 关于war包 jar包 ear包 及打包方法

    关于war包 jar包 ear包 及打包方法 war包:是做好一个web应用后,通常是网站打成包部署到容器中 jar包:通常是开发的时候要引用的通用类,打成包便于存放管理. ear包:企业级应用 通常 ...

  7. 记录一个UDP收包丢包的问题

    这几天写GB28181平台接入层代码,对收到的PS包进行解包时,总是出现误码,最终导致rtsp点播服务中画面花屏. 分析了码流抓包数据之后,发现网络上没有丢包,遂认为PS流解包代码有bug,于是埋头分 ...

  8. linux包之包管理命令rpm-yum

    背景 YUM(Yellow dog Updater, Modified)为多个Linux发行版的前端软件包管理器,例如 Redhat RHEL, CentOS & Fedora. YUM通过调 ...

  9. Python标准库03 路径与文件 (os.path包, glob包)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 路径与文件的简介请参看Linux文件系统 os.path包 os.path包主要是 ...

随机推荐

  1. Google140道面试题

    FQ找来,可能历史比较悠久了,慢慢看. 原文连接:http://www.impactinterview.com/2009/10/140-google-interview-questions/ Goog ...

  2. springmvc上传List,

    @RequestMapping("pay") public ModelAndView pay(String orderNo, TransactionDTO transaction, ...

  3. Enter password for default keyring to unlock

    file /home/ok/.gnome2/keyrings/login.keyring /home/ok/.gnome2/keyrings/login.keyring: GNOME keyring, ...

  4. SQL分页存储过程——表名、返回的列、排序字段、排序类型、条件、页尺寸、页码

    ALTER PROCEDURE [dbo].[SP_LGY_ICU_PAGECUT] ), -- 表名 ) = '*', -- 需要返回的列 )='''', -- 排序的欄位名 , -- 設置排序類型 ...

  5. linux 下解压rar文件

    今天遇到要在linux 服务器上解压几个rar 文件的问题,rar似乎是win 专属的压缩格式,所以linux 原生工具链中并没有支持rar 解压的工具.经过一系列搜索确定了一个脚linuxrar 的 ...

  6. sqlplus 中spool命令的简单用法

    spool基本格式: spool 路径+文件名 select col1||','||col2||','||col3||','||col4||'..' from tablename; spool off ...

  7. 打造理想的Windows 10 APP开发环境的5个步骤

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:微软即将发布Windows 10手机版,实际上很多人现在已经开始在开发Windows ...

  8. PDF解析记录——Pdfbox

    此文仅作记录[嫌放电脑里碍事-_-],内容为以前收集的一小段代码.   下面为pdf获取文本的简要代码片段: private string GetPDFText(string filename) { ...

  9. mathematica练习程序(图像取反)

    代码很简单,就四行,我想到可以用mathematica干点什么了. 有人通过mathematica编程研究过视频编解码算法么,挺有意思,可以尝试一下. img=Import["f:/lena ...

  10. waterMarkTextBox

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x ...