利用data.table包变形数据

一. 基础概念

data.table 这种数据结构相较于R中本源的data.frame 在数据处理上有运算速度更快,内存运用更高效,可认为它是data.frame 的升级版。同时,data.table 包具备更多更强的功能,它基本工作形式是,

dt [i, j, by]

dt 为data.table 结构

i 为行,j 为列,by 为分组

二. 创建 data.table

和data.frame一样,如下:

data.table(a=c(1, 2), b=c("a", "b"))

a b
1: 1 a
2: 2 b

转化data frame 或list 为 data.table,使用 setDT(df) (仅限于data.frame 和 list),as.data.table(df)(使用范围更广)

三. 取子集

3.1 行向(rows):

3.1.1. 以row numbers,dt [1:2, ]

3.1.2. 以条件(本质上是逻辑值 TRUE OR FALSE), dt [a>5, ]

有如下逻辑操作符:

<  <=  is.na()  %in%   |  %like%

>  >=  !is.na()  !          &  %between%  

3.2 列向(columns):

3.2.1. 抽提(同行,与data.frame一致)

dt [, c(2)]

dt [, .(b, c)]

3.2.2. 归纳

dt [, .(x=sum(a))]       --     创建一个新data.table 用a列的和

其他函数如:mean,median, min, max等等

3.2.3. 计算列 (在:= 接上计算表达式)

dt [, c:=1+2]

dt[a == 1, c := 1 + 2]

dt[,`:=`(c = 1 , d = 2)]     --    计算分开计算多列

a b c d
1: 1 a 1 2
2: 2 b 1 2

3.2.4. 删除某列

dt[,c := NULL]

3.2.5. 转换某列

dt[,b := as.integer(b)] – 如as.integer(), as.numeric(),as.character(), as.Date()等函数

四. 分组(by)

dt[, j, by = .(a)]      --  由a列内容进行分组

dt[, j, keyby= .(a)]  --  由a列内容进行分组,同时分类排序

常规分组操作:

dt[, .(c = sum(b)), by = a] –  以a列分组来计算b列和
dt[,c := sum(b), by = a] –  创建新列c来储存按a列分组来计算b列和的结果
dt[, .SD[1], by = a] – 抽提a列分组的第一行
dt[, .SD[.N], by = a] – 抽提a列分组的最后一行

五. 链式操作

dt[…][…]

六. data.table的功能函数(重点)

6.1 重排

setorder(dt, a, -b)  -- a列升序,b列降序(-)

注意:data.table中以“set”为前缀的功能函数以及操作符“:=”行使功能时,在内存中不创建副本,因此 setDT(df) 比 df <- as.data.table(df)更高效。

6.2 去重

unique(dt, by = c("a", "b")) -- 依次去重a, b列

uniqueN(dt, by = c("a", "b")) -- 计数去重后的行数

6.3 修改列名

setnames(dt, c("a","b"), c("x", "y"))

6.4 设置键(SET KEYS)

setkey(dt, a, b) -- 设置键是为快速重复查找特殊列用dt[.(value), ],或者是为了合并列用dt_a[dt_b]

七. 合并 data.tables

7.1 按列合并

dt_a[dt_b,on = .(b = y)]  -- 用于两个data.table有相同列的合并,如dt_a的b列与dt_b的y列相同

dt_a[dt_b,on = .(b = y, c > z)]  -- 上式的扩展,不仅用于相同列,更用于带有条件的合并,如不仅满足dt_a的b列与dt_b的y列相同,而且要满足dt_a的c列大于dt_b的z列

7.2 滚动合并

dt_a[dt_b, on = .(id = id, date = date), roll = TRUE]  --  不仅按id,data进行匹配,同时保持向最近一行进行匹配

7.3 全合并

rbind(dt_a, dt_b) -- 行合并

cbind(dt_a, dt_b) -- 列合并

八. 重构data.table(与reshape2包相似)

长数据 变 宽数据

dcast(dt, id ~ y, value.var= c("a", "b"))

宽数据 变 长数据

melt(dt,
id.vars= c("id"),
measure.vars= patterns("^a", "^b"),
variable.name = "y",
value.name = c("a", "b"))

九. 应用Apply 函数

dt[, lapply(.SD, mean), .SDcols = c("a", "b")]   ---

e.g. mean(), as.character(),
which.max()。

cols <-c("a")
dt[, paste0(cols, "_m") := lapply(.SD, mean),
.SDcols = cols] --- 重命名运算后的列

十. 对连续行计数

dt[, c := 1:.N, by = b] -- 分组后,计数行数,即计算每组有多少行

dt[, c := shift(a, 1), by = b]

十一. 读取和写入文件

fread("file.csv")

fread("file.csv", select = c("a", "b")) 这个函数很强大,除了读文件以外,可以直接读网址

fwrite(dt, "file.csv")  写入文件

基于R数据分析之常用Package讲解系列--1. data.table的更多相关文章

  1. R语言学习笔记(十七):data.table包中melt与dcast函数的使用

    melt函数可以将宽数据转化为长数据 dcast函数可以将长数据转化为宽数据 > DT = fread("melt_default.csv") > DT family_ ...

  2. Create and format Word documents using R software and Reporters package

    http://www.sthda.com/english/wiki/create-and-format-word-documents-using-r-software-and-reporters-pa ...

  3. 基于java平台的常用资源整理

    这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.t ...

  4. RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系列目录

    RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系列目录 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架 ...

  5. 这里整理了基于java平台的常用资源

    这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.t ...

  6. R语言中常用包(二)

    数据导入 以下R包主要用于数据导入和保存数据 feather:一种快速,轻量级的文件格式.在R和python上都可使用readr:实现表格数据的快速导入.中文介绍可参考这里readxl:读取Micro ...

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

    R语言数据分析利器data.table包-数据框结构处理精讲 R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代 ...

  8. Linux学习之路--常用命令讲解

    Linux常用命令讲解 1.命令格式:命令 [-选项]  [参数] 超级用户的提示符是# 一般用户的提示符是$ 如:ls -la /usr说明: 大部分命令遵从该格式多个选项时,可以一起写 eg:ls ...

  9. R数据分析:潜类别轨迹模型LCTM的做法,实例解析

    最近看了好多潜类别轨迹latent class trajectory models的文章,发现这个方法和我之前常用的横断面数据的潜类别和潜剖面分析完全不是一个东西,做纵向轨迹的正宗流派还是这个方法,当 ...

随机推荐

  1. Webshell免杀绕过waf

    转自圈子404师傅 0x01 前言# 尽最大努力在一文中让大家掌握一些有用的WEBSHELL免杀技巧 0x02 目录# 关于eval 于 assert 字符串变形 定义函数绕过 回调函数 回调函数变形 ...

  2. 代码审计-Beescms_V4.0

    Beescms_V4.0代码审计源于一场AWD线下比赛的漏洞源码  看了别的师傅的文章发现这个源码也非常简单 ,所以今晚简单审计过一遍. 0x01 预留后门 awd首先备份源码,然后下载下来查杀后门, ...

  3. 安装VMware Tools显示灰色正确解决办法

    首先问题如下: 解决办法如下:1.关闭虚拟机: 2.在虚拟机设置分别设置CD/DVD.CD/DVD2和软盘为自动检测三个步骤: 3.再重启虚拟机,灰色字即点亮. 大功告成,如果解决了你的问题,点个赞鼓 ...

  4. JavaScript实现百度搜索页面

    JavaScript实现百度搜索页面 HTML <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...

  5. shell变量(二)

    变量名的命名规范: 1.命名只能使用英文字母.数字和下划线,且不能以数字开头: 2.不能存在空格‘: 3.不能使用标点符号: 4.不能使用bash里的关键字(可使用help命令查看保留关键字) 变量的 ...

  6. 8.Linux用户管理(上)

    1.什么是用户? 能正常登陆系统的都算用户 windows系统和linux系统的用户有什么区别? 本质上没有区别, linux支持多个用户同一时刻登陆系统, 互相之间不影响 而windows只允许同一 ...

  7. mp-vue实现小程序回顶操作踩坑,wx.pageScrollTo使用无效填坑

    本来项目都写的差不多了,测试测着侧着就冒出了新的想法,我因为做的是问卷,因此会有用户必答题未答完的可能存在,本来市场部给的需求就是做一个弹窗就好了,她说想要做出跳回到用户未答的第一道题,好吧,既然都这 ...

  8. springboot使用spring配置文件

    1.如何在springboot中使用spring的配置文件,使用@Configuration和@ImportResource注解 package com.spring.task; import org ...

  9. C#解析深浅拷贝

    前言 前面我们学习完了设计模式,在其中我们有了解到原型模式.这里涉及到了克隆自身对象.那么也就是对对象进行拷贝.这里就涉及到了这么一个概念.深浅拷贝.何为深拷贝何为浅拷贝呢?我们一起来看看吧. 浅拷贝 ...

  10. 基于 HTML5 + Canvas 实现的 PID 可视化系统

    前言 随着工业物联网和互联网技术的普及和发展,人工填料的方式已经逐渐被机械设备取代.工业厂商减小误操作.提升设备安全以及追求高效率等制造特点对设备的要求愈加高标准.严要求.同时机械生产以后还需遵从整个 ...