重塑 data.table
在前面的章节中,我们已经学习了如何使用 reshape2 扩展包对 data.frame 进行
塑形。其实,data.table 扩展包为 data.table 对象提供了更快更强的 dcast( ) 函
数和 melt( ) 函数。
例如,将 toy_tests 的每个产品的质量得分按照年和月进行对齐:
toy_tests[, ym := substr(date, 1, 6)]
toy_quality <- dcast(toy_tests, ym ~ id, value.var = "quality")
toy_quality
## ym T01 T02
## 1: 201602 9 7
## 2: 201603 10 8
## 3: 201604 9 9
## 4: 201605 9 10
首先,我们使用 := 在 toy_tests 中直接创建了一个新列 ym,然后,使用 dcast( )
对 toy_tests 进行转换,这一步和前面 reshape2 的例子是一样的。结果看起来和在数
据框上使用 reshape2::dcast( ) 一样。
但是,reshape2::dcast( ) 不支持多个变量,而 data.table::dcast( ) 可以:
toy_tests2 <- dcast(toy_tests, ym ~ id, value.var = c("quality",
"durability"))
toy_tests2
## ym quality_T01 quality_T02 durability_T01 durability_T02
## 1: 201602 9 7 9 9
## 2: 201603 10 8 9 8
## 3: 201604 9 9 10 8
## 4: 201605 9 10 9 9
除了第 1 列以外,其他的列名都不再是 id 值,而是用下划线将变量名和 id 值连接起
来。此外,塑形公式 ym~id 左边的变量将被自动设置为结果 data.table 的键:
key(toy_tests2)
## [1] "ym"
这个键意味着我们可以通过提供一个 ym 的值,直接获得对应的记录。然而,下面的
代码会报错:
toy_tests2[.(201602)]
## Error in bmerge(i, x, leftcols, rightcols, io, xo, roll, rollends, nomatch, :
x.'ym' is a character column being joined to i.'V1' which is type 'double'.
Character columns must join to factor or character columns.
从错误信息来看,是因为数据的类型存在一些问题。因此,我们通过以下代码来查看
每一列的类:
sapply(toy_tests2, class)
## ym quality_T01 quality_T02 durability_T01
## "character" "integer" "integer" "integer"
## durability_T02
## "integer"
问题出在 ym 的类上。它是一个字符向量,但是我们提供了数值型的键。因为无法匹
配数据类型,所以搜索失败。如果我们提供一个字符串,便可得到对应的记录:
toy_tests2["201602"]
## ym quality_T01 quality_T02 durability_T01 durability_T02
## 1: 201602 9 7 9 9
但是,ym 是如何变成字符的呢?回顾一下,在 ym := substr(date, 1, 6)
中, date 是一个整数向量,但是,调用 substr( )函数时,先将 date 强制转换成字
符向量,再提取前 6 个字符。因此,结果是一个字符向量,至此,我们就很不会觉得那
么奇怪了。以下是简单的演示:
class(20160101)
## [1] "numeric"
class(substr(20160101, 1, 6))
## [1] "character"
这提醒我们,在进行数据操作时,对于键列的数据类型,需要小心一点。
重塑 data.table的更多相关文章
- 使用 data.table 包操作数据
在第一节中,我们回顾了许多用于操作数据框的内置函数.然后,了解了 sqldf 扩展包,它使得简单的数据查询和统计变得更简便.然而,两种方法都有各自的局限性.使用内置函数可能既繁琐又缓慢,而相对于各式各 ...
- R之data.table -melt/dcast(数据合并和拆分)
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 30.0px "Helvetica Neue"; color: #323333 } p. ...
- data.table包
data.table 1.生成一个data.table对象 生成一个data.table对象,记为DT. library(data.table) :],V3=round(rnorm(),),V4=:) ...
- R之data.table速查手册
R语言data.table速查手册 介绍 R中的data.table包提供了一个data.frame的高级版本,让你的程序做数据整型的运算速度大大的增加.data.table已经在金融,基因工程学等领 ...
- 两种Data Table参数化设置的区别
首先介绍Data Table的语法: 1.DataTable.value(ParameterID, SheetID) 2.DataTable(ParameterID, SheetID) 以上2种方法的 ...
- R语言数据分析利器data.table包 —— 数据框结构处理精讲
R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代码简洁,只要一行命令就可以完成诸多任务,另一方面是处理 ...
- R语言基因组数据分析可能会用到的data.table函数整理
R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代码简洁,只要一行命令就可以完成诸多任务,另一方面是处理快,内部 ...
- 将基因组数据分类并写出文件,python,awk,R data.table速度PK
由于基因组数据过大,想进一步用R语言处理担心系统内存不够,因此想着将文件按染色体拆分,发现python,awk,R 语言都能够非常简单快捷的实现,那么速度是否有差距呢,因此在跑几个50G的大文件之前, ...
- data.table包简介
data.table包主要特色是:设置keys.快速分组和滚得时序的快速合并.data.table主要通过二元检索法大大提高数据操作的效率,同时它也兼容适用于data.frame的向量检索法. req ...
随机推荐
- Python - 3.6 学习三
面向对象编程 面向对象编程 Object Oriented Programming 简称 OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程 ...
- applicationContext.xml的文件位置就可以有两种默认实现
ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息.因为它实现了ServletContextListener这个接口,在web ...
- centos6.8 环境一键安装包 nginx配置thinkphp5
---恢复内容开始--- lnmp1.4 一键安装包 nginx配置thinkphp5 环境:Nginx1.12.1 PHP5.6 Coentos6.8 修改网站配置文件 ser ...
- SQL---->mySQl数据库1------数据库的增删改查备份恢复
1.在终端输入:mysql -uroot -p 然后输入密码,进入客户端 2.输入:\s 3.创建数据库 3.1创建字符集是utf-8的数据库 3.2创建带校验规则的数据库,校验规则可以在a ...
- Servlet------>jsp EL表达式
取值: ${data}------>pageContext.findAttribute("data"); ${data.name}------>data.getName ...
- MegaCli 监控raid状态 限戴尔服务器
MegaCli 监控raid状态 MegaCli是一款管理维护硬件RAID软件,可以通过它来了解当前raid卡的所有信息,包括 raid卡的型号,raid的阵列类型,raid 上各磁盘状态,等等.通常 ...
- android(十四)四种启动模式
standard 启动的activity会每次都重新创建一个activity放到任务栈中.这是系统默认的启动模式. singleTop启动的activity,如果任务的栈顶刚好存在当前的activit ...
- stm8s 时钟库函数选择内部RC初始化
//本文选择16M内部RC震荡.分频为1 即系统时钟为16M void CLK_HSICmd(FunctionalState NewState) { /* Check the parameters * ...
- android 异步线程刷新UI 以及 JSON解析 以及 url get请求
import android.os.Handler; import android.os.Message; 1. Handler mHandler = new Handler() { @Overrid ...
- uva The Tower of Babylon[LIS][dp]
转自:https://mp.weixin.qq.com/s/oZVj8lxJH6ZqL4sGCXuxMw The Tower of Babylon(巴比伦塔) Perhaps you have hea ...