修身,齐家,治国,平天下。
《大学》孔子
人生的价值,并不是用时间,而是用深度去衡量的。
-- 列夫·托尔斯泰
转载来源:http://rsoftware.h.baike.com/article-1974931.html
(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,则可得到一列的数据框。此性质与矩阵类似。
数据框与SAS、SPSS和Stata的数据集或数据矩阵相似,是R语言数据结构的先进工作者。数据框是多个等长度的向量或因子组成。
在数据分析中,比如常用的生物数据分析,将同一观测单位的试验单元数据聚合在同一个数据结构变量中。此时,数据框的一行称为样本,而行中的每一个变量称为观察值。
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 5
eg2.创建有列名的数据框
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文件读取的数据框,因此日期变量是“2016-10-18”的标准日期格式,而da2是.txt文件读取的,因此日期变量是int型20161018,所以在建立时间序列时,应注意将da2的int型进行类型转换到Date型。
五类常用函数:class(),dim(),str(),rownames(),colnames(),names(),head(),tail()。
操作方法是使用行名,列名,下标[],$。又称为选取行列。若访问单列元素则构成向量,因此数据框对单列元素和多个向量的操作方法不同。
访问一列元素: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,]是访问第一行和第二行所有元素,不允许混淆。$符号可访问变量。
1.添加行或列
rbind()添加新行,cbind()添加新列,也可使用原有的列创建新的变量。
economy=rbind(economy,list(“wednesday”,6))
现在economy有六个观测。用list()表示一个观察。
创建新的列可用cbind()和$。
economy$rtn=c(50,30,50,20,30,10),
创建了变量rtn。若用cind()函数,则是
economy=cbind(economy,rtn=c(50,30,50,20,30,10))。
> economy
day project rtn
1 friday 1 50
2 saterday 2 30
3 sunday 3 50
4 monday 4 20
5 tuesday 5 30
6 wednesday 6 10
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"
若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. 变量赋值为NULL
>Leadership$q3=leadership$q4=NULL #用NULL
方法2. [,-]和[-,]
若已知q3和q4是第8列和第9列,则有,
>newdata=leadership[c(-8,-9)]
条件选择又称为筛选,在下标使用逻辑条件表达式实现数据的选择,包括变量计算符==、>、>=、<、<=、!=和表达式计算符&、|、!。条件选择可实现分组操作,是统计和分析的常用方法。
>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 Year
1 517 28.73 2001
2 582 27.90 2001
3 547 23.44 2001
4 614 18.33 2001
5 1068 12.38 2001
6 1005 11.23 2001
条件操作1:选择所有2001年的数据
> d1=dsf1[dsf1$Year==2001,] #选择行,所以向量Year必须在“,”前
> d1
SampleDepth Sources Year
1 517 28.73 2001
2 582 27.90 2001
3 547 23.44 2001
4 614 18.33 2001
5 1068 12.38 2001
6 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 2001 2001 2001 2001 2001 2001 #Year是int
> dsf2[6,3]=2002 #第6个观察的Year=2002
> d2=dsf2[dsf2$Year!=2001,] #Year不等于2001的观察
> d2
SampleDepth Sources Year
6 1005 11.23 2002 #只有第六个观测,注意新向量的序号不变
条件操作2:选择所有Sources大于20的观测
> d3=dsf1[dsf1$Sources>20,] #Sources变量>20
> d3
SampleDepth Sources Year #前3个观测
1 517 28.73 2001
2 582 27.90 2001
3 547 23.44 2001
条件操作3:两个条件的选择
> d4=dsf2[dsf2$Sources<=20&dsf2$Year!=2001,] #Sources小于20并且Year不等于2001
> d4
SampleDepth Sources Year
6 1005 11.23 2002 #只有第六个观测
> 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]
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()将数据框从搜索路径中移除。这种绑定方法有时出现错误,若先后有多个同名类似的数据框出现在系统中。请读者在实践中有选择地应用。
若数据框多个变量的类型相同,则可用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运算,可提高程序效率。
is.dataframe()判断是否为数据框
as.dataframe()转换为数据框
project1.中国沪深300指数(CSI300 index)程序
program1.数据框应用
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 rtn
1 2013-01-04 2524.409 #日期是R语言标准数据
2 2013-01-07 2535.985
3 2013-01-08 2525.330
4 2013-01-09 2526.126
5 2013-01-10 2530.569
6 2013-01-11 2483.230
#逻辑向量
> 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 acc
1 2551.814 2558.529 2524.409 2498.892 9798818400 95579242496
2 2518.047 2545.969 2535.985 2511.603 7516799200 73167511552
3 2534.647 2540.513 2525.330 2502.490 7183710400 76498059264
4 2518.104 2534.239 2526.126 2504.299 7023116800 74233593856
5 2525.590 2553.352 2530.569 2513.729 7108586400 71159046144
6 2533.495 2539.794 2483.230 2473.696 7423917600 72775925760
> d2=sapply(d1,mean) #应用sapply()函数,对每一列求均值
> d2
x1 x2 rtn x4 x5
2.441344e+03 2.463254e+03 2.442087e+03 2.419526e+03 7.216296e+09
acc
6.995672e+10
> class(d2) #d2的类型numeric,树脂型向量。标明sapply()函数输出向量
[1] "numeric"
在上面的程序中,数据框的应用是丰富的 。从.xlsx文件中将2013年CSI300 index数据读取,保存到数据框中。在数据框中选取多个变量创建新的数据框,设置列名,数据管理。主要有两个应用,条件选择建立逻辑向量,sapply()函数的应用,为CSI300 2013数据的每一列计算均值。
数据源是新浪财经。
2016年11月9日开始写作《R语言编程应用》