打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
R语言数据筛选、汇总、重构

最近学习的知识点总结如下:

3.1 去掉多余的数据

1)去掉不需要的行:

使用sqldf包中的sqldf()函数使用sql语句进行操作

  1. library(sqldf)
  2. sqldf("select* from mtcars where am=1 and vs=1")

运行结果如下:

与上面语句相同结果的语句如下:

subset(mtcars,am==1&vs==1) 

运行结果如下:


这是由于sqdf()函数的默认参数row.names=FALSE,需要修改为TRUE。然后结果就一致,比较结果是否一致用的函数是:

identical()函数

  1. identical(sqldf("select* from mtcars where am=1 and vs=1",row.names=TRUE),
  2. + subset(mtcars,am==1&vs==1)
  3. + )

2)去掉不需要的列

 subset(mtcars,am==1&vs==1,select=hp:wt)

3.1.1 快速去掉多余数据

  1. library(hflights)
  2. library(sqldf)
  3. system.time(sqldf("SELECT * from hflights where Dest == 'BNA'",row.names=TRUE)) #计算时间
  4. system.time(subset(hflights,Dest=='BNA'))


  1. library(dplyr) #dplyr包可以处理
  2. system.time(filter(hflights,Dest=='BNA'))

从效果上来看dplyr包可以更快的处理数据,但是不会保存行名称,需要先保存下来
  1. mtcars$rownames<-rownames(mtcars)
  2. select(filter(mtcars,hp>300),c(rownames,hp))

3.1.2 快速去掉多余数据的其他方法

  1. install.packages("data.table")
  2. library(data.table)
  3. hflights_dt<-data.table(hflights)
  4. hflights_dt[,rownames:=rownames(hflights)]
  5. system.time(hflights_dt[Dest=='BNA'])

这里用到的是data.table包的方法,下面显示的是如何用data.table语法来选择列:

str(hflights_dt[Dest=='BNA',list(DepTime,ArrTime)])

3.2 聚集

1)利用stats包中的aggregate函数:通过分组变量将数据划分成不同的子集,并分别对这些子集进行统计汇总。


  1. library(hflights)
  2. library(stats)
  3. aggregate(hflights$Diverted,by=list(hflights$DayOfWeek),FUN=mean) #利用dayofweek求航班延误的均值

2) 另外一种实现上面结果的函数是with()函数


 with(hflights,aggregate(Diverted,by=list(DayOfWeek),FUN=mean))

3.2.1 使用基础的R命令实现快速聚集

tapply(hflights$Diverted,hflights$DayOfWeek,mean)

返回结果是一个array对象,然后将结果增加合适的列名转换为data.frame是可行的。


3.2.2 方便的辅助函数
plyr包包含很多函数处理data.frame\list\array 类型的对象
函数名的第一个字符代表输入类型的类别,第二个字符代表输出格式,所有都以ply结尾
d(data.frame)s(array)l(list)m(以表格的方式为函数提供了多个参数)r(函数希望输入一个整数
以指明函数将要复制的次数,_是一种特殊的输出类型,此时函数将不返回任何结果)
ddply以data.frame为输入,返回也为data.frame
ldply以list为输入,返回data.frame
l_ply不返回任何结果
library(plyr)
ddply(hflights,.(DayOfWeek),function(x) mean(x$Diverted))

修改上面输出结果的第二列的名称


3.2.4 使用data.table完成聚集

  1. library(data.table)
  2. hflights_dt<-data.table(hflights)
  3. hflights_dt[,mean(Diverted),by=DayOfWeek]
下面更换列名
hflights_dt[,list('mean(Diverted)'=mean(Diverted),by=DayOfWeek)]

3.3 汇总函数

统计hflights数据集的分组样例数目


4.1 矩阵转置


4.2 基于字符串匹配实现数据筛选


  1. #筛选以delay结尾的数据
  2. library(dplyr)
  3. library(hflights)
  4. str(select(hflights,ends_with("delay",ignore.case=FALSE))) #也可以换成starts_with
  5. str(select(hflights,contains("T",ignore.case=FALSE))) #ignore.case=FALSE 是否考虑大小写
  6. str(select(hflights,matches("^[[:alpha:]]{5,6}$"))) #match 函数使用表达式作为参数,可以一次性
  7. #处理所有列名的匹配检测
  8. table(nchar(names(hflights))) #计算出数据的列名长度
  9. names(select(hflights,-matches("^[[:alpha:]]{7,8}$"))) #去掉列名长度为7或8的列,显示处理后的列名

4.3 数据重排序




自动导入的magrittr包提供的管道操作命令操作符调用上面三个表达式,将R对象作为其后R表达式的第一个参数

hflights %>% arrange(ActualElapsedTime) %>% str

下面语句,找到除了austin以外,距离最近的机场

  1. hflights %>%
  2. arrange(ActualElapsedTime) %>%
  3. select(ActualElapsedTime,Dest) %>%
  4. subset(Dest !='AUS') %>%
  5. head %>%
  6. str
  1. str(head(data.table(hflights,key='ActualElapsedTime')[Dest!='AUS',c('ActualElapsedTime','Dest'),with=FALSE])) #但是处理后的数据有缺失值
  2. str(head(na.omit(data.table(hflights,key='ActualElapsedTime'))[Dest!='AUS',list(ActualElapsedTime,Dest)]))

比较一下上面两种方法system.time():


4.5 创建新变量


  1. hflights_dt<-data.table(hflights)
  2. hflights_dt[,DistanceKMs:=Distance/0.62137]
  3. system.time(hflights_dt$DistanceKMs<-hflights_dt$Distance/0.62137)
  4. system.time(hflights_dt[,DistanceKMs:=Distance/0.62137])
4.5.1 内存使用分析

使用pyyr包,我们可以更好地了解一些辅助函数对内存的使用过程:

  1. library(pryr)
  2. hflights_dt<-data.table(hflights)

第一种方法重新分配了地址,第二种没有分配新的地址,所以第二种速度要更快一些

4.5.2 同时创建多个变量

hflights_dt[,c('DistanceKMs','DistanceFeets'):=list(Distance/0.62137,Distance*5280)]
  1. carriers<-unique(hflights_dt$UniqueCarrier)
  2. hflights_dt[,paste('carrier',carriers,sep='_')
  3. :=lapply(carriers,function(x) as.numeric(UniqueCarrier==x))]
  1. str(hflights_dt[,grep('^carrier',names(hflights_dt)),with=FALSE])
4.5.3 采用dplyr包生成新变量
  1. library(dplyr)
  2. hflignts<-hflights %>% mutate(DistanceKMs=Distance/0.62137)
str(hflights)
#和以下运行结果是一样的
hflights<-mutate(hflights,DistanceKMs=Distance/0.62137)
str(hflights)
4.7.1 将宽表转换为长表

数据框溶解是指将表格数据根据给定标识变量转换为键-值对类型


  1. library(reshape)
  2. head(melt(hflights))
  3. system.time(head(melt(hflights)))
  4. library(reshape2)
  5. system.time(head(melt(hflights)))
  6. hflights_melted<-melt(hflights,id.vars=0,measure.vars=c('ActualElapsedTime','AirTime'))
  7. str(hflights_melted)


  1. library(ggplot2)
  2. ggplot(hflights_melted,aes(x=variable,y=value))+geom_boxplot()

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
新手须知的函数R包脑回路
R最快且比dplyr最高效的大数据处理R包:tidyfst
用R为数据分析插上翅膀
Broom |tidy up a bit,模型,检验结果一键输出!
2005年华为招聘--C语言笔试试题(答案自己写的,仅供参考)
linux c之strncpy函数和strncmp函数最简单使用总结
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服