【数据处理】R语言--data.table包使用总结

本文详细介绍了R语言中data.table包的使用,包括安装、数据导入、选择列、重命名变量、子集筛选、利用索引提升效率、排序、添加更新列、数据聚合等功能。通过实例展示了data.table的强大功能,特别适用于处理大型数据集。
摘要由CSDN通过智能技术生成

data.table包使用总结

R中的data.table包提供了一个data.frame的高级版本,让你的程序做数据整型的运算速度大大的增加。data.table已经在金融,基因工程学等领域大放光彩。他尤其适合那些需要处理大型数据集(比如 1GB 到100GB)需要在内存中处理数据的人。不过这个包的一些符号并不是很容易掌握,因为这些操作方式在R中比较少见。这也是这篇文章的目的,为了给大家提供一个速查的手册。

data.table的通用格式: DT[i, j, by],对于数据集DT,选取子集行i,通过by分组计算j

1.首先下载安装data.table包

install.packages("data.table") 
library(data.table)

利用fread函数导入数据,在data.table包支持使用fread函数从本地或者web上导入数据,功能相当于base包的read.csv。

mydata = fread("https://github.com/arunsrinivasan/satrdays-workshop/raw/master/flights_2014.csv")

2.数据简单描述

nrow(mydata)
[1] 253316

ncol(mydata)
[1] 17

names(mydata)
[1] "year"      "month"     "day"       "dep_time"  "dep_delay" "arr_time"  "arr_delay"
[8] "cancelled" "carrier"   "tailnum"   "flight"    "origin"    "dest"      "air_time"
[15] "distance"  "hour"      "min" 

head(mydata[,c(2:6)])
   month day dep_time dep_delay arr_time
1:     1   1      914        14     1238
2:     1   1     1157        -3     1523
3:     1   1     1902         2     2224
4:     1   1      722        -8     1014
5:     1   1     1347         2     1706
6:     1   1     1824         4     2145

3.选择或保留某几列

.()为list()的一个别名。如果使用.(),返回的为一个data.table对象。如果不使用.(),结果为返回一个向量。

如果要选择carrier列,那么可以选择如下几种方式实现:

dat1 = mydata[ , carrier] # 返回一组向量

dat1 = mydata[ , .(carrier)] #返回一个data.table

dat1 = mydata[, c("carrier"), with=FALSE] #返回一组数据框

根据列的位置保留某几列,比如选择第二列:

dat2 =mydata[, 2, with=FALSE]

保留多列:

dat3 = mydata[, .(origin, year, month, hour)]

根据列的位置保留多列:

dat3 = mydata[, .(origin, year, month, hour)]

删去列:利用!符号删除某列

dat5 = mydata[, !c("origin"), with=FALSE]

删去多列

dat6 = mydata[, !c("origin", "year", "month"), with=FALSE]

利用%like% 命令进行模糊匹配:

dat7 = mydata[,names(mydata) %like% "dep", with=FALSE]

4.对变量进行重命名

可以利用setnames()函数对变量进行重命名操作:

setnames(mydata, c("dest"), c("Destination"))

对多个变量进行重命名:

setnames(mydata, c("dest","origin"), c("Destination", "origin.of.flight"))

5.子集的筛选与过滤

假设要找到origin为‘JFK’的所有子集:

dat8 = mydata[origin == "JFK"]

按多个条件选择

dat9 = mydata[origin %in% c("JFK", "LGA")]

dat11 = mydata[origin == "JFK" & carrier == "AA"]

6.利用索引提升数据操作效率

使用setkey()函数设置键值
setkey()函数可以在数据集mydata上设置键值。当我们设置好key后,data.table会将数据按照key来排序。
利用setkey函数将origin设置为mydata的索引:

setkey(mydata, origin)

当设置好索引后,可直接利用索引的值进行过滤查找

data12 = mydata[c("JFK", "LGA")]

来看看用了索引与没用索引的搜索效率:

system.time(mydata[origin %in% c("JFK", "LGA")])
system.time(mydata[c("JFK", "LGA")])

对多个变量设置索引

setkey(mydata, origin, dest)
mydata[.("JFK", "MIA")]

这等同于:

mydata[origin == "JFK" & dest == "MIA"]

重要参数

  • 41
    点赞
  • 196
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
这段代码使用了 R 语言中的 data.table 进行数据处理操作。它对一个名为 `data` 的数据框进行了一系列变换操作,下是对每个操作简要说明: 1. `library(data.table)`:导入 data.table 。 2. `setDT(data)`:将数据框 `data` 转换为 data.table 格式,以便使用 data.table 提供的高效操作。 3. `data[, startlabel := as.character(start.station.id)]`:添加一个名为 `startlabel` 的列,并将 `start.station.id` 列的值转换为字符类型赋给 `startlabel` 列。 4. `data[, endlabel := as.character(end.station.id)]`:添加一个名为 `endlabel` 的列,并将 `end.station.id` 列的值转换为字符类型赋给 `endlabel` 列。 5. `data[, label := frank(paste0(startlabel, endlabel), ties.method = "dense"), by = start.station.id]`:根据 `start.station.id` 列进行分组,使用 `paste0(startlabel, endlabel)` 生成组内各观测的唯一标签,并使用 `frank` 函数为每个组内的观测分配密集排名,并将结果赋给 `label` 列。 6. `data[, startlabel := as.integer(label)]`:将 `label` 列的值转换为整数类型,并赋给 `startlabel` 列。 7. `data[, endlabel := frank(paste0(endlabel, start.station.id), ties.method = "dense"), by = end.station.id]`:根据 `end.station.id` 列进行分组,使用 `paste0(endlabel, start.station.id)` 生成组内各观测的唯一标签,并使用 `frank` 函数为每个组内的观测分配密集排名,并将结果赋给 `endlabel` 列。 8. `data[, endlabel := as.integer(endlabel)]`:将 `endlabel` 列的值转换为整数类型。 9. `data <- data[, -"label"]`:删除 `label` 列。 10. `data <- as.data.frame(data)`:将数据框 `data` 转换回 data.frame 格式。 请注意,这只是代码的解释,并非实际运行该代码的环境。如果你想运行该代码,请确保已经安装了 data.table ,并且数据框 `data` 中含了对应的列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值