dplyr和data.table是R的两个高效数据处理惩罚包,这两个包有它们各自的利益。dplyr包的语法越发优雅,提供了更易于人类所能领略的自然语言。data.table包的语法简捷,而且只需一行代码就可以完成许多工作。进一步地,data.table在某些环境下执行效率更高(见这里)。在机能和内存受约束的环境,data.table包或者是推荐的R包。关于dplyr和data.table包之间的比拟可以参考StackOverflow和Quora。
配景先容在我的数据处理惩罚任务中,我算是利用dplyr和data.table包很长一段时间的用户了。对付相识这两个包个中之一的读者来说,我会利用这两个包来完成一个沟通的任务,以便辅佐各人快速的进修另一个R包。假如你相识个中之一,并对进修另一个R包感乐趣,那么这篇文章就是为你筹备的。
dplyrdplyr包的5个函数可以有效的执行数据处理惩罚的大部门任务,别离如下:
select:用于选取一列可能多列filter:用于选取特定条件下的某些行arrange:用于实现数据一列或多列的升降排序mutate:用于在数据会合添加列summarise:用于实现数据汇总data.tabledata.table包提供了一个很是简捷的通用名目:DT[i,j,by],可以领略为:对付数据集DT,选取子集行i,通过by分组计较j。
数据处理惩罚首先,我们需要加载一些R包:
library(dplyr)library(data.table)library(lubridate)library(jsonlite)library(tidyr)library(ggplot2)
library(compare)本次尝试数据来历于DATA.GOV,它是一份关于医院医保的索赔支出数据,数据从这里下载。本文利用jsonlite包中的fromJSON函数来下载该数据集的JSON名目数据。JSON是一个用于实现欣赏器与处事器异步通信的常见数据名目,假如你能领略下述获取数据的代码行的话那很是好。这里有两篇关于利用jsonlite包来处理惩罚JSON名目数据的入门教程—教程1和教程2。虽然,假如你只存眷于data.table和dplyr包的利用要领,你完全可以安心的运行下眼前两行代码而忽略详细的细节。
如上所示,导入的所有数据列都是因子型数据。下面我们将列中数据为数值的列改为数值型数据:
cols = 6:11; # 需要改变数据范例的列hospital_spending[,cols] <- lapply(hospital_spending[,cols],as.character)hospital_spending[,cols] <- lapply(hospital_spending[,cols], as.numeric)最后两列数据别离是数据收集的起始日期和竣事日期。因此,我们需要利用lubridate包来更正这两列的数据范例:
cols = 12:13; # 需要更正的两列hospital_spending[,cols] <- lapply(hospital_spending[,cols], ymd_hms)此刻,我们可以查抄下数据列是否是我们想要的数据范例:sapply(hospital_spending, class)$Hospital.Name “factor”$Provider.Number. “factor”$State “factor”$Period “factor”$Claim.Type “factor”$Avg.Spending.Per.Episode..Hospital. “numeric”$Avg.Spending.Per.Episode..State. “numeric”$Avg.Spending.Per.Episode..Nation. “numeric”$Percent.of.Spending..Hospital. “numeric”$Percent.of.Spending..State. “numeric”$Percent.of.Spending..Nation. “numeric”$Measure.Start.Date “POSIXct” “POSIXt” $Measure.End.Date “POSIXct” “POSIXt”建设data.table范例数据
利用data.table函数建设data.table范例数据:
hospital_spending_DT = data.table(hospital_spending)
class(hospital_spending_DT)
“data.table” “data.frame”
选取数据集的某些列对付选取数据列,我们可以利用dplyr包中的select函数。另一方面,我们只需在data.table中指定对应的列名即可。
选取一个变量选取“Hospital Name”列:
from_dplyr = select(hospital_spending, Hospital.Name)from_data_table = hospital_spending_DT[,.(Hospital.Name)]此刻,我们比拟下dplyr和data.table给出的功效是否沟通:
compare(from_dplyr,from_data_table, allowAll=TRUE)TRUEdropped attributes
删除一个变量from_dplyr = select(hospital_spending, -Hospital.Name)from_data_table = hospital_spending_DT[,!c(“Hospital.Name”),with=FALSE]compare(from_dplyr,from_data_table, allowAll=TRUE)TRUEdropped attributes我们也可以利用:=函数来修改data.table输入范例的引用。对copy()函数所复制的输入工具获得的引用执行任何操纵都不会对原始数据工具发生任何影响。如下所示:
DT=copy(hospital_spending_DT)DT=DT[,Hospital.Name:=NULL]”Hospital.Name”%in%names(DT)FALSE我们也可以一次性删除多个变量:
DT=copy(hospital_spending_DT)DT=DT[,c(“Hospital.Name”,”State”,”Measure.Start.Date”,”Measure.End.Date”):=NULL] c(“Hospital.Name”,”State”,”Measure.Start.Date”,”Measure.End.Date”) %in% names(DT) FALSE FALSE FALSE FALSE
选取多个变量选取如下变量:“Hospital.Name”,“State”,“Measure.Start.Date”,“Measure.End.Date”
from_dplyr = select(hospital_spending, Hospital.Name,State,Measure.Start.Date,Measure.End.Date)from_data_table = hospital_spending_DT[,.(Hospital.Name,State,Measure.Start.Date,Measure.End.Date)]compare(from_dplyr,from_data_table, allowAll=TRUE)TRUEdropped attributes 删除多个变量
此刻,我们要删除hospital_spending数据框和data.table范例数据hospital_spending_DT中的变量Hospital.Name,State,Measure.Start.Date,Measure.End.Date:
from_dplyr = select(hospital_spending, -c(Hospital.Name,State,Measure.Start.Date,Measure.End.Date))from_data_table = hospital_spending_DT[,!c(“Hospital.Name”,”State”,”Measure.Start.Date”,”Measure.End.Date”),with=FALSE]compare(from_dplyr,from_data_table, allowAll=TRUE)TRUEdropped attributesdplyr包中有contains(),starts_with(),ends_with()三个函数,它们可以跟select()函数一起团结利用。对付data.table,我们则可以利用正则表达式。下面我们将选取所有列名包括字符“Date”的列,示譬喻下:
from_dplyr = select(hospital_spending,contains(“Date”))from_data_table = subset(hospital_spending_DT,select=grep(“Date”,names(hospital_spending_DT)))compare(from_dplyr,from_data_table, allowAll=TRUE)TRUEdropped attributes
names(from_dplyr)”Measure.Start.Date” “Measure.End.Date”
重定名列名setnames(hospital_spending_DT,c(“Hospital.Name”, “Measure.Start.Date”,”Measure.End.Date”), c(“Hospital”,”Start_Date”,”End_Date”))
names(hospital_spending_DT)
“Hospital” “Provider.Number.” “State” “Period” “Claim.Type” “Avg.Spending.Per.Episode..Hospital.” “Avg.Spending.Per.Episode..State.” “Avg.Spending.Per.Episode..Nation.” “Percent.of.Spending..Hospital.” “Percent.of.Spending..State.” “Percent.of.Spending..Nation.” “Start_Date” “End_Date”
hospital_spending = rename(hospital_spending,Hospital= Hospital.Name, Start_Date=Measure.Start.Date,End_Date=Measure.End.Date)
compare(hospital_spending,hospital_spending_DT, allowAll=TRUE)TRUE dropped attributes筛选数据集的某些行
对付数据集特定行的筛选,我们可以利用dplyr包中的filter函数,它通过大概包括正则表达式的逻辑语句来实现该成果。在data.table中,我们只需利用逻辑语句就可以了。
对单个变量举办筛选from_dplyr = filter(hospital_spending,State==’CA’) # selecting rows for California
from_data_table = hospital_spending_DT[State==’CA’]compare(from_dplyr,from_data_table, allowAll=TRUE)TRUE dropped attributes
对多个变量举办筛选from_dplyr = filter(hospital_spending,State==’CA’ & Claim.Type!=”Hospice”) from_data_table = hospital_spending_DT[State==’CA’ & Claim.Type!=”Hospice”]compare(from_dplyr,from_data_table, allowAll=TRUE)TRUE dropped attributesfrom_dplyr = filter(hospital_spending,State %in% c(‘CA’,’MA’,”TX”)) from_data_table = hospital_spending_DT[State %in% c(‘CA’,’MA’,”TX”)]unique(from_dplyr$State)CA MA TX
compare(from_dplyr,from_data_table, allowAll=TRUE)TRUEdropped attributes
数据排序我们利用dplyr包中的arrange()函数对数据行举办排序,可以实现对一个或多个变量的数据行举办排序。假如想实现降序,需利用如下代码所示的desc()函数。以下示例演示了如何对数据行举办升序和降序排序:
升序from_dplyr = arrange(hospital_spending, State)from_data_table = setorder(hospital_spending_DT, State)compare(from_dplyr,from_data_table, allowAll=TRUE)TRUEdropped attributes
降序from_dplyr = arrange(hospital_spending, desc(State))from_data_table = setorder(hospital_spending_DT, -State)compare(from_dplyr,from_data_table, allowAll=TRUE)TRUEdropped attributes
对多变量举办排序以下代码实现了State变量升序,End_Date变量降序排序:from_dplyr = arrange(hospital_spending, State,desc(End_Date))from_data_table = setorder(hospital_spending_DT, State,-End_Date)compare(from_dplyr,from_data_table, allowAll=TRUE)TRUEdropped attributes
添加或更新列在dplyr包中,利用mutate()函数来添加新列。在data.table包中,我们可以利用:=引用来添加或更新列:
from_dplyr = mutate(hospital_spending, diff=Avg.Spending.Per.Episode..State. – Avg.Spending.Per.Episode..Nation.)from_data_table = copy(hospital_spending_DT)from_data_table = from_data_table[,diff := Avg.Spending.Per.Episode..State. – Avg.Spending.Per.Episode..Nation.]compare(from_dplyr,from_data_table, allowAll=TRUE)TRUEsortedrenamed rowsdropped row namesdropped attributes
from_dplyr = mutate(hospital_spending, diff1=Avg.Spending.Per.Episode..State. – Avg.Spending.Per.Episode..Nation.,diff2=End_Date-Start_Date)from_data_table = copy(hospital_spending_DT)from_data_table = from_data_table[,c(“diff1″,”diff2”) := list(Avg.Spending.Per.Episode..State. – Avg.Spending.Per.Episode..Nation.,diff2=End_Date-Start_Date)]compare(from_dplyr,from_data_table, allowAll=TRUE)TRUEdropped attributes
数据汇总我们可以利用dplyr包中的summarise()函数来建设归纳综合性统计量:#p#分页标题#e#
虽然,我们也可以对各分组的数据块别离求概述性统计量。在dplyr中利用group_by()函数,data.table中指定by参数即可:
head(hospital_spending_DT[,.(mean=mean(Avg.Spending.Per.Episode..Hospital.)),by=.(Hospital)])#p#分页标题#e#
mygroup= group_by(hospital_spending,Hospital) from_dplyr = summarize(mygroup,mean=mean(Avg.Spending.Per.Episode..Hospital.))from_data_table=hospital_spending_DT[,.(mean=mean(Avg.Spending.Per.Episode..Hospital.)), by=.(Hospital)]compare(from_dplyr,from_data_table, allowAll=TRUE)
TRUE sorted renamed rows dropped row names dropped attributes
我们也可以对多个分组条件举办分组计较:
head(hospital_spending_DT[,.(mean=mean(Avg.Spending.Per.Episode..Hospital.)),
by=.(Hospital,State)])
mygroup= group_by(hospital_spending,Hospital,State)from_dplyr = summarize(mygroup,mean=mean(Avg.Spending.Per.Episode..Hospital.))from_data_table=hospital_spending_DT[,.(mean=mean(Avg.Spending.Per.Episode..Hospital.)), by=.(Hospital,State)]compare(from_dplyr,from_data_table, allowAll=TRUE)TRUE sorted renamed rows dropped row names dropped attributes
链式操纵在dplyr和data.table包中,我们可以利用链式操纵来实现代码的持续性。在dplyr中,利用magrittr包中的%>%管道函数很是酷。%>%的成果是用于实现将一个函数的输出通报给下一个函数的第一个参数。在data.table中,我们可以利用%>%或[来实现链式操纵。
总结在本篇文章,我们展示了利用data.table和dplyr包来执行沟通的任务。它们有各自的优点。dplyr包的语法越发优雅,提供了更易于人类所能领略的自然语言。data.table包的语法简捷,而且只需一行代码就可以完成许多工作。进一步地,data.table在某些环境下执行速度更快,在机能和内存受限制的环境下data.table或者是推荐方案。
接待插手本站果真乐趣群贸易智能与数据阐明群乐趣范畴包罗各类让数据发生代价的步伐,实际应用案例分享与接头,阐明东西,ETL东西,数据客栈,数据挖掘东西,报表系统等全方位常识QQ群:81035754