R语言-源数据自动选取数据源

R语言︱数据集分组
大型数据集通常是高度结构化的,结构使得我们可以按不同的方式分组,有时候我们需要关注单个组的数据片断,有时需要聚合不同组内的信息,并相互比较。
一、日期分组
1、关于时间的包都有很多很好的日期分组应用。
2、cut()函数
cut(x, n):将连续型变量x分割为有着n个水平的因子
cut(x, breaks, labels = NULL,
include.lowest = FALSE, right = TRUE, dig.lab = 3,
ordered_result = FALSE, ...)
介绍一种按照日期范围——例如按照周、月、季度或者年——对其进行分组的超简便处理方式:R语言的cut()函数。
假设vector中存在以下示例数据:
vDates &- as.Date(c(&&, &&, &&, &&)) #as.Data()函数的作用非常重要;如果没有它,R语言会认为以上内容仅仅是数字串而非日期对象
[1] && && && &&
vDates.bymonth &- cut(vDates, breaks = &month&)
Dates &- data.frame(vDates, vDates.bymonth)
3、dplyr包
#dplyr中基本函数 filter——数据筛选(筛选观测值,行)
filter(Hdma_dat,pclass == 1)
#####################################
#dplyr中基本函数 select——子集选取(筛选变量,列)
select(Hdma_dat,pclass,survived) ##选择pclass变量
二、数据分组以及分组汇总
1、cut函数
b&- cut(a, 5,labels=F)
#将数据平均分成5组,rank=5代表大,rank=1代表小
2、aggregate函数——分组汇总
result1&-aggregate(orders$AMOUNT, orders[,c(&SELLERID&,&CLIENT&)],sum)
result2&-aggregate(orders$AMOUNT, orders[,c(&SELLERID&,&CLIENT&)],max)
result&-cbind(result1,result2$x)
代码解读:
1.从名字就可以看出,aggregate是专用于分组汇总的函数,它的输入参数和计算结果都是数据框,用法相对简单。
2.aggregate函数不能对分组后的数据进行多种汇总计算,因此要用两句代码分别实现sum和max算法,最后再用cbind拼合。显然,上述代码在性能和易用性上存在不足。
3.aggregate函数对分组字段的顺序有一个奇怪的要求:必须反向排列。鉴于这个怪要求,先对CLIENT分组再对SELLERID分组就必须写成:orders[,c(&SELLERID&,&CLIENT&)]。如果按照正常的思维习惯写代码,结果将是错误的。
4.不仅代码的写法违反正常的思维习惯,计算后的结果也很怪异:SELLERID字段会排在CLIENT之前。事实上,为了使计算结果更符合业务逻辑,上述的代码还要继续加工才行。
总结:aggregate函数勉强可用,但在性能和方便性上存在不足,代码的写法、计算结果、业务逻辑这三者不一致。
三、split – apply – combine模式——分组处理模式
对数据的转换,可以采用split – apply – combine模式来进行处理:
split:把要处理的数据分割成小片断;
apply:对每个小片断独立进行操作;
combine:把片断重新组合。
R 当中是split( ),*apply( ),aggregate( )…,以及plyr包
1、split函数
split( )的基本用法是:group &- split(X,f)
&&&&其中X 是待分组的向量,矩阵或数据框。f是分组因子。
##按照已有的类别数据,分类
g&-split(Cars93,Cars93$Origin)
#按照cars93数据集,按照origin进行分组
##例2:对矩阵分组(按列)
m&-cbind(x=1:10,y=11:20)
split(m,col(m))
#col代表m的下标(行)
[1] 1 2 3 4 5 6 7 8 9 10
[1] 11 12 13 14 15 16 17 18 19 20
##后续处理
##计算组的长度和组内均值
& sapply(g,length)
USA non-USA
& sapply(g,mean)
USA non-USA
##用lapply也可以,返回值是列表
& lapply(g,mean)
[1] 18.57292
$`non-USA`
[1] 20.50889
##分组结果
summary(g)
split还有一个逆函数,unsplit,可以让分组完好如初。
在base包里和split功能接近的函数有cut(对属性数据分划),strsplit(对字符串分划)以及subset(对向量,矩阵或数据框按给定条件取子集)等。
a&-matrix(1:20,ncol=4)
[,1] [,2] [,3] [,4]
a[row(a)==1&col(a)==1] #将返回1, 第一行第一列
a[row(a)==1&col(a)==2] #将返回6, 第一行第二列
2、一个网络例子:
sp&-split(orders,orders[,c(&SELLERID&,&CLIENT&)],drop=TRUE)
result1&-lapply(sp,FUN=function(x) sum(x$AMOUNT))
result2&-lapply(sp,FUN=function(x) max(x$AMOUNT))
result&-cbind(result1,result2)
代码解读:
1.Split函数的作用是将数据框按照指定字段分组,但不做后续计算。lapply函数可以对每组数据都执行同样的算法。Split和lapply两者结合可以实现本案例。
2.由于分组后的数据可以复用,因此本算法比aggregate性能更高。
3.Lapply函数也不支持多种统计方法,因此也要用两句代码分别实现sum和max算法,最后再用cbind拼合。另外,本算法还要额外用到split函数,因此在易用性上没有改进,反而是更差了。
4.分组顺序仍然要违反正常的思维习惯,必须反写成:orders[,c(&SELLERID&,&CLIENT&)]。
5.计算结果需要大幅加工,很不方便。可以看到,计算结果中的第一列实际上是“SELLERID.CLIENT”,我们需要把它拆分成两列并调换顺序才行。
本算法在性能上有所提高,但在易用性上明显不足,在代码写法、业务逻辑、计算结果上仍然存在不一致。
3、Lapply 是 apply 函数族
Lapply&是&apply&函数族的一份子,类似的函数还有&sapply&和&tapply。其中&sapply&的用法和&lapply&的区别只在参数上,如下:
sp&-split(orders,orders[,c(&SELLERID&,&CLIENT&)],drop=TRUE)
result1&-sapply(sp,simplify=FALSE,FUN=function(x) sum(x$AMOUNT))
result2&-sapply(sp,simplify=FALSE,FUN=function(x) max(x$AMOUNT))
result&-cbind(result1,result2)
tapply&专用于数据框,按理说最适合解决本案例,但事实并非如此。&tapply&只对单字段分组适用,在进行双字段联合分组时其结果为二维矩阵,用户还需要进行复杂的处理才行,比如&tapply(orders$AMOUNT,&orders[,c(&SELLERID&,&CLIENT&)],function(x)&sum(x))
4、subset()函数
利用subset()函数进行访问和选取数据框的数据更为灵活,subset函数将满足条件的向量、矩阵和数据框按子集的方式返回。
subset(x, subset, ...)
subset(x, subset, select, drop = FALSE, ...)
##对于矩阵
subset(x, subset, select, drop = FALSE, ...)
##对于数据框
x是对象,subset是保留元素或者行列的逻辑表达式,对于缺失值用NA代替。
Select 是选取的范围,应小于x。
& x&-data.frame(matrix(1:30,nrow=5,byrow=T))
& rownames(x)=c(&one&,&two&,&three&,&four&,&five&)
& colnames(x)=c(&a&,&b&,&c&,&d&,&e&,&f&)
& new&-subset(x,a&=14,select=a:f)
## 从a到f列选取a&14的行。
5、which定位函数
功能:返回服从条件的观测所在位置(行数),有一定的排序功能在其中。可见
subset()在数据集中非常好用,which是针对较小的数据筛选,比较低纬度的数据筛选时候可以用的。
subset=which+数据集操作
which=order+多变量运行。
data$V1[which(data$V2&0)]
#筛选出V1中,V2小于0的数字,跟order的作用些许相似
#order用法
iris$Sepal.Length[order(iris$setosa)]
#按照照setosa的大小,重排Sepal.Length数据列
——————————————————————————————————————————————————————————————
四、dplyr与data.table
data.table可是比dplyr以及python中的pandas还好用的数据处理方式。
data.table包的语法简洁,并且只需一行代码就可以完成很多事情。进一步地,data.table在某些情况下执行效率更高。(参考来源:)
在使用data.table时候,需要预先布置一下环境:
data&-data.table(data)
如果不布置环境,很多内容用不了。data.table包提供了一个非常简洁的通用格式:DT[i,j,by],可以理解为:对于数据集DT,选取子集行i,通过by分组计算j。
最让我在意的是分组汇总这块内容:
mygroup= group_by(data,gender,ID)
from_dplyr&-summarize(mygroup,mean=mean(mortgage))
#dplyr用两步
from_data_table&-try[,.(mean=mean(&span style=&font-family: 'Microsoft YaHei';&&mortgage&/span&)),by=.(&span style=&font-family: 'Microsoft YaHei';&&gender,ID&/span&)]
#data.table用一步
代码的意思是,通过性别gender,以及ID分组,然后分组求资产mortagage的平均数。
data.table比较简洁一步搞定,dplyr花了两步,不过也dplyr也可以通过%&%来实现一步搞定。%&%的功能是用于实现将一个函数的输出传递给下一个函数的第一个参数。
from_dplyr=data %&% group_by(gender,ID) %&% summarize(mean=mean(mortagage))
本文已收录于以下专栏:
相关文章推荐
R语言变量或样本选取,可用which subset grep %in%等
which 主要是通过逻辑索引为真来选取样本
dat2[which(dat2$国家 == &中华人民共和...
seq(from,to,length),
该函数的意思是生成一组
R语言杂七杂八
与R语言有关的应用工具
探索性数据分析
机器学习-分类问题
R与Rstudio的获取与安装
包package一种扩展R基本功能的机制集成了众多函数
导入包l...
allzl=unique(iris$setosa)
for (i in 1:2){
pp=iris[iris$setosa==allzl[i],]
网页版Rstudio︱RStudio Server多人在线协作开发
想了解一下RStudio Server,太给力的应用,可以说成是代码分布式运行,可以节省时间,放大空间。
RStudio是...
笔者寄语:感谢CDA DSC训练营周末上完课,常老师、曾柯老师加了小课,讲了echart与R结合的函数包recharts的一些基本用法。通过对比谢益辉老师GitHub的说明文档,曾柯老师极大地简化了一...
地球是圆的,现在我们都已经知道了,然而在我们所处的位置看过去,地面是平的,在这么一点眼界里面怎么感知地球是圆的?亦即如在MACD均线里面,在当前所处的一点位置看过去是正直无比的,似乎下一个时间段的钱垂...
R语言数据分析系列之五,R语言数据可视化
分箱法在实际案例操作过程中较为常见,能够将一些数据离散化,等级化,比如年龄段,我们并不想知道确切的几岁,于是乎可以将其分组、分段。
基础函数中cut能够进行简单分组,并且可以用于等宽分箱法。
他的最新文章
讲师:姜飞俊
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)[译]用R语言做挖掘数据《七》
时间: 13:56:49
&&&& 阅读:3558
&&&& 评论:
&&&& 收藏:1
标签:时间序列与数据挖掘
&一、实验说明
&1. 环境登录
无需密码自动登录,系统用户名shiyanlou,密码shiyanlou
&2. 环境介绍
本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到:
1. LX终端(LXTerminal): Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令2. GVim:非常好用的编辑器,最简单的用法可以参考课程3. R:在命令行输入&R&进入交互式环境,下面的代码都是在交互式环境运行4. 数据:在命令行终端输入以下命令:
# 下载数据
wget http://labfile./courses/360/synthetic_control.tar.gz
# 解压数据到当前文件夹
tar zxvf synthetic_control.tar.gz
&3. 环境使用
使用R语言交互式环境输入实验所需的代码及文件,使用LX终端(LXTerminal)运行所需命令进行操作。
完成实验后可以点击桌面上方的&实验截图&保存并分享实验结果到微博,向好友展示自己的学习进度。实验楼提供后台系统截图,可以真实有效证明您已经完成了实验。
实验记录页面可以在&我的主页&中查看,其中含有每次实验的截图及笔记,以及每次实验的有效学习时间(指的是在实验桌面内操作的时间,如果没有操作,系统会记录为发呆时间)。这些都是您学习的真实性证明。
&二、课程介绍
1. R中的时间序列数据 2. 将时间序列分解为趋势型、季节型以及随机型 3. 在R中构建,并用其预测未来数据 4. 介绍,然后使用DTW距离以及欧式距离处理时间序列从而实现层次聚类。 5. 关于时间序列分类的三个例子:一个是使用原始数据,一个是使用经过后的数据,另外一个是。
三、课程内容
1、R中的时间序列数据
使用ts这个类可以抽取等时间距离的样本,当参数frequency=7的时候说明选取样本的频率单位是周,以此类推,频率为12和4分别生成月度和季度数据。具体实现如下:
# 生成1-30的整数,频率是12也就是月度数据,从2011年3月开始
& a &- ts(1:30, frequency=12, start=c(2011,3))
& print(a)
# 转换为字符串型
# 输出该时间序列的属性
& attributes(a)
执行结果如下:
2、时间序列分解
时间序列分解就是将时间序列按趋势性、季节性、周期性和不规则性依次分解。其中,趋势部分代表的是长期趋势,季节性指的是时间序列数据呈现季节性波动,周期性指的是指数据呈现周期性波动,不规则部分就是。
下面讲解一个关于时间序列分解的例子,使用的数据AirPassengers由Box & Jenkins国际航班从1949年到1960年的乘客数据组成。里面有144个观测值。
& plot(AirPassengers)
# 将数据预处理成月度数据
& apts &- ts(AirPassengers, frequency=12)
# 使用函数decompose()分解时间序列
& f &- decompose(apts)
# 季度数据
& f$figure
& plot(f$figure, type="b", xaxt="n", xlab="")
# 使用当前的时间区域给月份赋予名称
& monthNames &- months(ISOdate(,1))
# 使用月份名称标记x轴
# side=1表示设置x轴,at指的是范围从10-12,las表示分割的单位刻度为2
& axis(1, at=1:12, labels=monthNames, las=2)
结果如下:
上图中,‘observed‘标注的表表示原始的时间序列分布图,往下第二个图是显示数据的呈现上升趋势图,第三个季节图显示数据受一定的季节因素影响,最后一个是在移除趋势和季节影响因素后的图。
思考:R里面还有哪些包,哪些函数可以实现时间序列的分解,并试着使用那些函数实现分解,并将分解结果进行对比。
3、时间序列预测
时间序列预测就是基于历史数据预测未来事件。一个典型的例子就是基于股票的历史数据预测它的开盘价。在时间序列预测中有两个比较经典的模型分别是:自回归移动平均模型(ARMA)和差分整合移动平均自回归模型(ARIMA)。
下面使用单变量时间序列数据拟合ARIMA模型,并用该模型预测。
# 参数order由(p,d,q)组成,p=1指的是自回归项数为1,list内容是季节seasonal参数
& fit &- arima(AirPassengers, order=c(1,0,0), list(order=c(2,1,0), period=12))
# 预测未来24个月的数据
& fore &- predict(fit, n.ahead=24)
# 95%的置信水平下的误差范围(U,L)
& U &- fore$pred + 2*fore$se
& L &- fore$pred - 2*fore$se
# col=c(1,2,4,4)表示线的颜色分别为黑色,红色,蓝色,蓝色
# lty=c(1,1,2,2)中的1,2指连接点的先分别为实线和虚线
& ts.plot(AirPassengers, fore$pred, U, L, col=c(1,2,4,4), lty = c(1,1,2,2))
& legend("topleft", c("Actual", "Forecast", "Error Bounds (95% Confidence)"),col=c(1,2,4), lty=c(1,1,2))
预测结果如下:
4、时间序列聚类
时间序列聚类就是基于密度和距离将时间序列数据聚类,因此同一个类里面的时间序列具有相似性。有很多衡量距离和密度的指标比如欧式距离、、最大模、、两个向量之间的角度()以及动态时间规划(DTW)距离。
4.1 动态时间规划距离
动态时间规划能够找出两个时间序列的最佳的对应关系,通过包‘dtw‘可以实现该算法。在包‘dtw‘中,函数dtw(x,y,...)计算动态时间规划并找出时间序列x与y之间最佳的对应关系。
代码实现:
& library(dtw)
# 平均生成100个在0-2*pi范围的序列idx
& idx &- seq(0, 2*pi, len=100)
& a &- sin(idx) + runif(100)/10
& b &- cos(idx)
& align &- dtw(a, b, step=asymmetricP1, keep=T)
& dtwPlotTwoWay(align)
a与b这两个序列的最佳对应关系如下图所示:
4.2 合成控制图的时间序列
合成控制图时间序列数据集&synthetic_control.data&存放于当前工作目录‘/home/shiyanlou‘下,它包含600个合成控制图数据,每一个合成控制图都是由60个观测值组成的时间序列,那些合成控制图数据被分为6类: - 1-100:正常型; - 101-200:周期型; - 201-300:上升趋; - 301-400:下降趋势; - 401-500:上移; - 401-600:下移。
首先,对数据进行预处理:
& sc &- read.table("synthetic_control.data", header=F, sep="")
# 显示每一类数据的第一个样本观测值
& idx &- c(1,101,201,301,401,501)
& sample1 &- t(sc[idx,])
合成控制图时间序列样本数据分布如下:
4.3 使用欧式距离层次聚类
首先从上面的合成控制图每一类数据中随机选取10个样本进行处理:
& set.seed(6218)
& s &- sample(1:100, n)
& idx &- c(s, 100+s, 200+s, 300+s, 400+s, 500+s)
& sample2 &- sc[idx,]
& observedLabels &- rep(1:6, each=n)
# 使用欧式距离层次聚类
& hc &- hclust(dist(sample2), method="average")
& plot(hc, labels=observedLabels, main="")
# 将聚类树划分为6类
& rect.hclust(hc, k=6)
& memb &- cutree(hc, k=6)
& table(observedLabels, memb)
聚类结果与实际分类对比:
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &图4.1
图4.1中,第1类聚类正确,第2类聚类不是很好,有1个数据被划分到第1类,有2个数据划分到第3类,有1个数据划分到第4类,且上升趋势(第3类)和上移(第5类)并不能很好的被区分,同理,下降趋势(第4类)和下移(第6类)也没有被很好的被识别。
4.4 使用DTW距离实现层次聚类
实现代码如下:
& library(dtw)
& distMatrix &- dist(sample2, method="DTW")
& hc &- hclust(distMatrix, method="average")
& plot(hc, labels=observedLabels, main="")
& rect.hclust(hc, k=6)
& memb &- cutree(hc, k=6)
& table(observedLabels, memb)
聚类结果如下:
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &图4.2
对比图4.1和4.2可以发现,由后者的聚类效果比较好可看出在测量时间序列的相似性方面,DTW距离比欧式距离要好点。
5、时间序列分类
时间序列分类就是在一个已经标记好类别的时间序列的基础上建立一个分类模型,然后使用这个模系去预测没有被分类的时间序列。从时间序列中提取新的特征有助于提高分类模系的性能。提取特征的方法包括、、和。
5.1 使用原始数据分类
我们使用包‘party‘中的函数ctree()来给原始时间序列数据分类。实现代码如下:
# 给原始的数据集加入分类标签classId
& classId &- rep(as.character(1:6), each=100)
& newSc &- data.frame(cbind(classId, sc))
& library(party)
& ct &- ctree(classId ~ ., data=newSc,controls = ctree_control(minsplit=30, minbucket=10, maxdepth=5))
& pClassId &- predict(ct)
& table(classId, pClassId)
# 计算分类的准确率
& (sum(classId==pClassId)) / nrow(sc)
& plot(ct, ip_args=list(pval=FALSE),ep_args=list(digits=0))
输出决策树:
5.2 提取特征分类
接下来,我们使用DWT(离散小波变化)的方法从时间序列中提取特征然后建立一个分类模型。能处理多样的频率数据,因此具有自适应性。
下面展示一个提取DWT系数的例子。离散小波变换在R中可以通过包‘wavelets‘实现。包里面的函数dwt()可以计算离散小波的系数,该函数中主要的3个参数X、filter和boundary分别是单变量或多变量的时间序列、使用的小波过滤方式以及分解的水平,函数返回的参数有W和V分别指离散小波系数以及尺度系数。原始时间序列可以通过函数idwt()逆离散小波重新获得。
& library(party)
& library(wavelets)
& wtData &- NULL
# 遍历所有时间序列
& for (i in 1:nrow(sc)) {
+ a &- t(sc[i,])
+ wt &- dwt(X=a, filter="haar", boundary="periodic")
+ wtData &- rbind(wtData, unlist(c(, [[]])))
& wtData &- as.data.frame(wtData)
& wtSc &- data.frame(cbind(classId, wtData))
# 使用DWT建立一个决策树,control参数是对决策树形状大小的限制
& ct &- ctree(classId ~ ., data=wtSc,controls = ctree_control(minsplit=30, minbucket=10, maxdepth=5))
& pClassId &- predict(ct)
# 将真实分类与聚类后的类别进行对比
& table(classId, pClassId)
K-NN算法也可以用于时间序列的分类。算法流程如下: - 找出一个新对象的k个最近邻居 - 然后观察该区域内拥有相同属性的数量最多的类代表该区域所属的类
但是,这种直接寻找k个最近邻居的算法为O(n**2),其中n是数据的大小。因此,当处理较大数据的时候就需要一个有效索引的方式。包‘RANN‘提供一个快速的最近邻搜索算法,能够将算法的时间复杂度缩短为O(n log n)。下面是在没有索引的情况下实现K-NN算法:
# 通过在第501个时间序列中添加噪声来创建一个新的数据集
& newTS &- sc[501,] + runif(100)*15
# 使用&DTW&方法计算新数据集与原始数据集之间的距离
& distances &- dist(newTS, sc, method="DTW")
# 给距离升序排列
& s &- sort(as.vector(distances), index.return=TRUE)
# s$ix[1:k]是排行在前20的距离,表哥输出k个最近邻居所属的类
& table(classId[s$ix[1:k]])
输出结果如下:
由上图输出表格数据可知,20个邻居中有19个数据都属于第6类,因此将该类时间序列划分到第六类时间序列中。
**思考**:经过学习这么多时间序列分类,请思考以上时间序列分类方法的利与弊。
更多数据挖掘教材请来学习。标签:
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!(桃花侠战菊花怪)
第三方登录:第二节:R语言数据框
17:26:38 本文行家:
&1.数据框与数组、向量的不同(1)行名rownames&&&&&&数据框和数组有行名和列名,向量没有行名只有标签。行名(序号)函数rownames(),列名函数colnames()。若数据框没有列名,则R语言将第一行数据当作列名。R语言标签函数names()。(2)维度dim&&列在数据框中称为变量。若数据框只有一个变量,而有245行记录,则维度&&&&&&&行数量,变量数量&=&245,1&。数组是一维的,而且有245个元素,则维度是&1,245&。向量没有维度,向量有245个元素,维度是NULL。R语言维度函数dim()。(3)若数组是一维的数值,类型是array。而向量是数值的,则类型是numric。(4)数据框可将类型不同的向量构成一个整体,然而每一个向量的元素数量相同。在面向对象技术中称为聚合。而数组只能是类型相同的向量构成。向量在数据框中称为变量。(5)提取数据框子集,若提取的子集是向量,则创建向量而不是数据框。但是设定参数drop=FALSE,则可得到一列的数据框。与矩阵类似。2.数据框数据框与SAS、SPSS和Stata的数据集或数据矩阵相似,是R语言数据结构的先进工作者。数据框是多个等长度的向量或因子组成。在数据分析中,比如常用的生物数据分析,将同一观测单位的试验单元数据聚合在同一个数据结构变量中。此时,数据框的一行称为样本,而行中的每一个变量称为观察值。2.1创建数据框data.frame()创建数据框,将不同类型的向量组合成整体,要求向量的元素数量相同。&eg1.&创建有两个变量的数据框&&&&&&day=c("friday","saterday","sunday","monday","tuesday")&&&&&&project=c(1,2,3,4,5)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&economy=data.frame(day,project,stringAsFactors=FALSE)&&&data.frame()函数创建了数据框economy。参数stringAsFactors=FALSE表明若向量是字符串string&,则并不转换为因子(factor)处理。stringAsFactors的默认值是TRUE。数据框economy的变量day是字符串类型,所以应规定string的处理方式。数据框economy的向量day,project称为变量,而economy的行记录称为一个观测。&class(economy)“data.frame”&dim(economy)[1] &2 &5eg2.创建有列名的数据框economy=data.frame(D=day,P=project)&&&&data.frame()创建了数据框economy,列名是D、P,day将转换为因子。eg3.文件读取数据创建数据框&&&&da1=read.xlsx(“file1”,1)&&&&da2=read.txt(“file2”,head=TRUE)则da1和da2是数据框,可用数据管理的class()查明。然而,da1是.xlsx文件读取的数据框,因此日期变量是“”的标准日期格式,而da2是.txt文件读取的,因此日期变量是int型,所以在建立时间序列时,应注意将da2的int型进行类型转换到Date型。2.2 数据管理&&&&五类常用函数:class(),dim(),nrow(),ncol(),str(),rownames(),colnames(),names(),head(),tail()。2.3&&访问行、列和元素操作方法是使用行名,列名,下标[],$。又称为选取行列。若访问单列元素则构成向量,因此数据框对单列元素和多个向量的操作方法不同。访问一列元素:economy[1]或者economy[,1]。这两个下标表示方法并不同。&&&&&&&&&&&&&&economy$day,economy$D,数据框$变量名。访问一行元素:economy[1,]访问多列元素:economy[1:2],economy[,1:2],访问第1、2个变量。访问多行元素:ecomomy[1:4,],访问第1~4个观测,第1:4行元素。访问一个元素:economy[2,1],访问第二行第一个元素。访问数据子集:economy[2:4,2],访问所有第二行到第四行的第二个元素。访问任意元素:ecomomy[c(2,4),2],访问第二行和第四行的第二个元素。&&&&从以上访问方法可知,数据框[]中的行下标和列下标用“,”区分。若没有“,”则是访问变量的方法。应知道economy[1:2]是访问第一列和第二列所有元素,而economy[1:2,]是访问第一行和第二行所有元素,不允许混淆。$符号可访问变量。$是一种简化的操作符,daf$var 等价daf[["var", exact = FALSE]]。$可部分match变量名。2.3 数据操作1.添加行或列&&&&rbind()添加新行,cbind()添加新列,也可使用原有的列创建新的变量。&&&&economy=rbind(economy,list("wednesday",6))现在economy有六个观测。用list()表示一个观察。&&&&创建新的列可用cbind()和$。&&&&economy$rtn=c(50,30,50,20,30),&& 创建变量rtn。若用cbind(),则是&&&&economy=cbind(economy,rtn=c(50,30,50,20,30))。2.合并数据框&&&&合并函数包括:&&&&* &cbind()&& 按列合并&&&&* &rbind()&& 按行合并&&&&* &merge() 合并只有单变量相同的两个不同数据框。&&&&rbind(),cbind()合并数据框,前提是数据框有相同的行数或列数。&&&&&&d=rbind(df1,df2)&,按行合并数据框df1,df2,创建数据框d。rbind()合并相同结构的数据框,例如不同年份的公司股票数据。d=cbind(df1,df2),按列合并数据框df1,df2,要求df1和df2有相同数量的观测。cbind()合并相同长度的数据框。&d=cbind(df1,df2)&&&&Error in data.frame(..., check.names = FALSE) : &&参数值意味着不同的行数: 143, 167& dim(data1)[1]&143&&&5& dim(data2)[1]&167&&5表明cbind()不能用来合并两个行数不同的数据框。&&&&&merge()根据某个共同变量的值,合并两个数据框。例如:两个数据框都有变量day,而且行数相同,则可用merge()合并。若变量信息内容相同但名称{day,date}不同,则用参数by.x=”day”,by.y=”date”。&&&&要横向合并两个数据框,请使用merge()函数。在多数情况下,两个数据框是通过一个或多个共有变量进行联结的(即一种内联结,inner join)。如果要直接横向合并两个矩阵或数据框,并且不需要指定一个公共索引,可使用cbind()函数。&&3.赋值&&&& 选取数据框的元素构成一个新的数据框,则用-&或=。&&&&& eco1=economy[c(1,3,4),],创建数据框eco1,有3行元素,每行有2个变量值。若仅选取一列,则economy[c(1,3,4),1]构成向量,因此构成单列数据框,则用参数drop=FALSE。&eco2=economy[c(1,3,4),2,drop=FALSE]&& #建立单列数据框&class(eco2)"data.frame"&eco3=economy[c(1,3,4),2]&& #建立向量eco3&class(eco3)"int"2.4删除行、列若de是一个数据框,dim(de)=(1000,11),则删除一列 &de[-6],de[,-6],删除第六列。删除一行 &de[-58,],删除第58行。删除多列 &de[,-c(1:117)],删除第1到第117列。删除任意多行 &de[-c(1,57:59)],删除第1行,第57,58,59行。删除元素,请读者自己考虑。eg3.删除变量的方法& & 数据框leadership有10个变量,删除变量q3,q4。方法1.&Leadership$q3=leadership$q4=NULL& #用NULL方法2.&&&&&& 若已知q3和q4是第8列和第9列,则有,&newdata=leadership[c(-8,-9)]2.5条件操作&&&&&& &&&&& 条件选择又称为筛选,在下标使用逻辑条件表达式实现数据的选择,包括变量计算符==、&、&=、&、&=、!=和表达式计算符&、|、!。条件选择可实现分组操作,是统计和分析的常用方法。&file1="D:/financialCapital/ISIT.txt"&&#数据源见第一节《R语言的程序设计框架》&depthseafish=read.table(file1,header=T)&#ISIT.txt文件读到depthseafish数据框中&dsf=depthseafish &dim(dsf)&&&&&&&#数据框的维度,789个观测,14个变量[1] 789 &14&&&&数据框的行名rownames设置。数据框dsf的元素数量惊人,因此创建一个小型数据框dsf1。&dsf1=dsf[1:6,c(1,2,10)]&&#选取第1~6行和第1,2,10列构成数据框dsf1&dim(dsf1)[1] 6 3& head(dsf1)&&SampleDepth Sources Year1 &&&&&&&&517 &&28.73 20012 &&&&&&&&582 &&27.90 20013 &&&&&&&&547 &&23.44 20014 &&&&&&&&614 &&18.33 20015 &&&&&&&1068 &&12.38 20016 &&&&&&&1005 &&11.23 2001&& 条件操作1:选择所有2001年的数据& d1=dsf1[dsf1$Year==2001,] &&#选择行,所以向量Year必须在“,”前& d1&&SampleDepth Sources Year1 &&&&&&&&517 &&28.73 20012 &&&&&&&&582 &&27.90 20013 &&&&&&&&547 &&23.44 20014 &&&&&&&&614 &&18.33 20015 &&&&&&&1068 &&12.38 20016 &&&&&&&1005 &&11.23 2001&&&& 所以观测的Year变量都在2001年前。为验证条件选择的正确性,将第6个观察的Year改成2002年。& dsf2=dsf1& str(dsf2)'data.frame': &&6 obs. of &3 variables:&$ SampleDepth: num &517 582 547 614 1068 ...&$ Sources &&&: num &28.7 27.9 23.4 18.3 12.4 ...&$ Year &&&&&&: int &01 01&& #Year是int& dsf2[6,3]=2002&& #第6个观察的Year=2002& d2=dsf2[dsf2$Year!=2001,]&& #Year不等于2001的观察& d2&&SampleDepth Sources Year6 &&&&&&&1005 &&11.23 2002&&&&&&&&&&&&&&&&&&&& #只有第六个观测,注意新向量的序号不变&&& 条件操作2:选择所有Sources大于20的观测& d3=dsf1[dsf1$Sources&20,]& #Sources变量&20& d3&&&& &&SampleDepth Sources Year& #前3个观测1 &&&&&&&&517 &&28.73 20012 &&&&&&&&582 &&27.90 20013 &&&&&&&&547 &&23.44 2001&& 条件操作3:两个条件的选择&& d4=dsf2[dsf2$Sources&=20&dsf2$Year!=2001,]&& #Sources小于20并且Year不等于2001& d4&&SampleDepth Sources Year6 &&&&&&&1005 &&11.23 2002&&&&&&&&&&&&&&& #只有第六个观测布尔操作符有&和|,与if语句的&&和||不同。2.6 设置数据框的行名和列名& namesd=c('A','B','C','D','E','F')&&&&&& rownames(dsf1)=namesd&&&&#设置数据框dsf1的行名& rownames(dsf1)[1] "A" "B" "C" "D" "E" "F"&&&&可用数据框的一列作为序号,例如:&& &&rownames(dsf1)=dsf1[,1]&&&&&#注意不能是dsf1[1]3.数据框的函数
& subset()函数,可不用设定na.rm=TRUE。在大量数据中去掉含有一个以上的NA值的观测,complete.cases()可选择完整的行。ewdaf=subset(dataframe,logic expression,select=c(colname1,...,colnamen))eg1.创建项目完成时间&30天,而且安全生产无事故时间在28天以上的新数据框。&newproject=subset(project,dates&30|safedate&28,select=c(col1,col2,col3,col4))&&&&函数attach()将数据框添加到R的搜索路径,则在访问变量时可不再使用$。函数detach()将数据框从搜索路径中移除。这种绑定方法有时出现错误,若先后有多个同名类似的数据框出现在系统中。请读者在实践中有选择地应用。&&4.sapply和lapply函数应用
若数据框多个变量的类型相同,则可用apply()类函数。apply()的循环在所隶属软件包的函数内实现,所有称为“隐式”循环。apply()对矩阵的行或列进行操作,第二个参数表示应用到哪个维度(或下标向量)。sapply()和lapply()对只能对数据框进行数值运算。sapply表示simplified apply。sapply(data,f(),na.rm=T),表示对数据框data的所有变量或者选取的列,进行函数f()计算,na.rm=T表示移除缺失值。sapply()的输出是向量,而lapply()的返回值是列表。根据输出选择所用apply类函数。sapply(veg[,5:9],mean)表示对数据框veg的第5列到第9列取均值。sapply()或lapply()对数据框的每一列进行相同的FUN=mean运算,可提高程序效率。 &&&&&&&&&&&&&&&&&&&&&&#Year &Wage-amount &offer-from&&&&5.类型转换
& is.dataframe()判断是否为数据框&&&& as.dataframe()转换为数据框R语言编程基础数据框应用
library(fGarch)library(fBasics)library(fUnitRoots)library(xlsx)library(rJava)library(forecast)library(timeDate)library(xts)library(urca) library(zoo)&&&&&& #金融数据分析软件包& &&dfile&-"D:/programsdata/2013CSI.xlsx";&&&&&&&&&#2013年CSI数据&dset&-read.xlsx(dfile,1);&& #dset是数据框& dset1&-dset&&&&&&& #dset股指到dsef1,保存dset& dset1e=dset1[c(1,4)]&& #选取数据框的两列& colnames(dset1e)=c("date","rtn")& #设置数据框的列名& head(dset1e)&& #数据管理&&&&&&& date &&&&&rtn1
&& #日期是R语言标准数据2
&&&&& #逻辑向量& rownames(dset1e)&&& #数据框的行名,序号&&[1] "1" &&"2" &&"3" &&"4" &&"5" &&"6" &&"7" &&"8" &&"9" &&"10" &"11" &"12" &[13] "13" &"14" &"15" &"16" &"17" &"18" &"19" &"20" &"21" &"22" &"23" &"24" &[25] "25" &"26" &"27" &"28" &"29" &"30" &"31" &"32" &"33" &"34" &"35" &"36" &[37] "37" &"38" &"39" &"40" &"41" &"42" &"43" &"44" &"45" &"46" &"47" &"48" &[49] "49" &"50" &"51" &"52" &"53" &"54" &"55" &"56" &"57" &"58" &"59" &"60" &[61] "61" &"62" &"63" &"64" &"65" &"66" &"67" &"68" &"69" &"70" &"71" &"72" &[73] "73" &"74" &"75" &"76" &"77" &"78" &"79" &"80" &"81" &"82" &"83" &"84" &[85] "85" &"86" &"87" &"88" &"89" &"90" &"91" &"92" &"93" &"94" &"95" &"96" &[97] "97" &"98" &"99" &"100" "101" "102" "103" "104" "105" "106" "107" "108"[109] "109" "110" "111" "112" "113" "114" "115" "116" "117" "118" "119" "120"[121] "121" "122" "123" "124" "125" "126" "127" "128" "129" "130" "131" "132"[133] "133" "134" "135" "136" "137" "138" "139" "140" "141" "142" "143" "144"[145] "145" "146" "147" "148" "149" "150" "151" "152" "153" "154" "155" "156"[157] "157" "158" "159" "160" "161" "162" "163" "164" "165" "166" "167" "168"[169] "169" "170" "171" "172" "173" "174" "175" "176" "177" "178" "179" "180"[181] "181" "182" "183" "184" "185" "186" "187" "188" "189" "190" "191" "192"[193] "193" "194" "195" "196" "197" "198" "199" "200" "201" "202" "203" "204"[205] "205" "206" "207" "208" "209" "210" "211" "212" "213" "214" "215" "216"[217] "217" "218" "219" "220" "221" "222" "223" "224" "225" "226" "227" "228"[229] "229" "230" "231" "232" "233" "234" "235" "236" "237" "238"& rownames(dset1e)&"1"&&&#条件选择,比序号"1"大的所有符号&&[1] FALSE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE&[13] &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE&[25] &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE&[37] &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE&[49] &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE&[61] &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE&[73] &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE&[85] &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE&[97] &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE[109] &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE[121] &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE[133] &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE[145] &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE[157] &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE[169] &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE[181] &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE[193] &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE[205] &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE[217] &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE[229] &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE &TRUE&& #sapply()函数应用& d1=dset1[,2:7]& #选取日期向量外的所有变量& colnames(d1)=c("x1","x2","rtn","x4","x5","acc")& #设置列名& head(d1)& #数据管理&&&&&&&&&&&&x1&&&&&&&&& x2&&&&&&& & rtn&&&&&&& && x4&&&&&&&&&& && x5&&&&&&&&& && acc1 8.529 8.892
2 5.969 1.603
3 0.513 2.490
4 4.239 4.299
5 3.352 3.729
6 9.794 3.696
& d2=sapply(d1,mean)&& #应用sapply()函数,对每一列求均值& d2&&&&&&&&& x1&&&&&&&&&&&&&&&&&&&& &x2&&&&&&&&&&&&&&&&&&&& rtn&&&&&&&&&&&&&&&&&&&&&& x4&&&&&&&&&&&&&&&&&& & x5 2.& 2.&&2.&&&&&& 2.&&&&&&& 7. &&&&&&&& acc 6. & class(d2)&&&&& #d2的类型numeric,树脂型向量。标明sapply()函数输出向量[1] "numeric"应注意,逻辑向量选出对应位置为 TRUE 的元素。 当用表达式来创建逻辑向量时,这种方法有用。
参考资料:
[1] R语言初学者指南.西安交通大学.
[2] R语言统计入门,人民邮电出版社.
[3] R语言实战
[4] R语言编程艺术
百科的文章(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。如需转载,请注明来源于。
现在是私立大学教师。碌碌无为不是我的明天。

我要回帖

更多关于 excel表格选取数据 的文章

 

随机推荐