在前面的章节中,我们已经学习了如何使用 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的更多相关文章

  1. 使用 data.table 包操作数据

    在第一节中,我们回顾了许多用于操作数据框的内置函数.然后,了解了 sqldf 扩展包,它使得简单的数据查询和统计变得更简便.然而,两种方法都有各自的局限性.使用内置函数可能既繁琐又缓慢,而相对于各式各 ...

  2. R之data.table -melt/dcast(数据合并和拆分)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 30.0px "Helvetica Neue"; color: #323333 } p. ...

  3. data.table包

    data.table 1.生成一个data.table对象 生成一个data.table对象,记为DT. library(data.table) :],V3=round(rnorm(),),V4=:) ...

  4. R之data.table速查手册

    R语言data.table速查手册 介绍 R中的data.table包提供了一个data.frame的高级版本,让你的程序做数据整型的运算速度大大的增加.data.table已经在金融,基因工程学等领 ...

  5. 两种Data Table参数化设置的区别

    首先介绍Data Table的语法: 1.DataTable.value(ParameterID, SheetID) 2.DataTable(ParameterID, SheetID) 以上2种方法的 ...

  6. R语言数据分析利器data.table包 —— 数据框结构处理精讲

        R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代码简洁,只要一行命令就可以完成诸多任务,另一方面是处理 ...

  7. R语言基因组数据分析可能会用到的data.table函数整理

    R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代码简洁,只要一行命令就可以完成诸多任务,另一方面是处理快,内部 ...

  8. 将基因组数据分类并写出文件,python,awk,R data.table速度PK

    由于基因组数据过大,想进一步用R语言处理担心系统内存不够,因此想着将文件按染色体拆分,发现python,awk,R 语言都能够非常简单快捷的实现,那么速度是否有差距呢,因此在跑几个50G的大文件之前, ...

  9. data.table包简介

    data.table包主要特色是:设置keys.快速分组和滚得时序的快速合并.data.table主要通过二元检索法大大提高数据操作的效率,同时它也兼容适用于data.frame的向量检索法. req ...

随机推荐

  1. interface Impl

    public interface ActionBarOperations { void initSthOne(); void initSthTwo(); } public class ActionBa ...

  2. Linux系统下Nginx+PHP 环境安装配置

    一.编译安装Nginx 官网:http://wiki.nginx.org/Install 下载:http://nginx.org/en/download.html # tar -zvxf nginx- ...

  3. 【巷子】---vue路由懒加载---【vue】

    一.懒加载 也叫延迟加载或者按需加载,即在需要的时候进行加载,   二.为什么要使用懒加载 像vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要 ...

  4. could not execute menu item系统找不到指定的文件

    Wamp3.0.6 64bit,系统任务栏图标,左键,Apache菜单,httpd.conf,报错“could not execute menu item.....系统找不到指定的文件” 根据网上的搜 ...

  5. 利用Qt开发跨平台APP(二)(iOS,使用Qt5.9,很详细,有截图)

    本文将手把手教你如何使用Qt编译出iOS应用程序. Qt是一个优秀的跨平台开发工具.我们利用Qt可以很方便地将一次编写的应用,多次编译到不同平台上,如Windows.Linux.MAC.Android ...

  6. AOP切点表达式

    Aspectj切入点语法定义 在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut"切入点" 例如定义切入点表达式  execu ...

  7. java爬取网页内容 简单例子(2)——附jsoup的select用法详解

    [背景] 在上一篇博文java爬取网页内容 简单例子(1)——使用正则表达式 里面,介绍了如何使用正则表达式去解析网页的内容,虽然该正则表达式比较通用,但繁琐,代码量多,现实中想要想出一条简单的正则表 ...

  8. centos7 安装Mariadb

    MariaDB 数据库管理系统是 MySQL 的一个分支,主要由开源社区在维护,采用 GPL 授权许可.开发这个分支的原因之一是:甲骨文公司收购了 MySQL 后,有将 MySQL 闭源的潜在风险,因 ...

  9. vuejs和webpack项目(VueComponent)初尝试——瀑布流组件

    碎碎念:     好久不见,最近自己有些懈怠没更过多少博,主要原因之一是对自己学习方式的一些思考,翻看之前的博客多是记录学习笔记这反映出了自己对于前端还停留在学习-复习知识点的阶段压根没多少实践经验啊 ...

  10. PAT 1132 Cut Integer[简单]

    1132 Cut Integer(20 分) Cutting an integer means to cut a K digits lone integer Z into two integers o ...