您的位置:首页 > 编程语言

掌握R语言编程基础的数据框

2016-10-20 12:34 405 查看
                              修身,齐家,治国,平天下。

                                     《大学》孔子
                   人生的价值,并不是用时间,而是用深度去衡量的。
                                               -- 列夫·托尔斯泰                                                                              
      转载来源:http://rsoftware.h.baike.com/article-1974931.html

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  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型。

2.2 数据管理

    五类常用函数:class(),dim(),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,]是访问第一行和第二行所有元素,不允许混淆。$符号可访问变量。

2.4 数据操作

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"

2.5 删除行、列

若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)]

2.6 条件操作      

      条件选择又称为筛选,在下标使用逻辑条件表达式实现数据的选择,包括变量计算符==、>、>=、<、<=、!=和表达式计算符&、|、!。条件选择可实现分组操作,是统计和分析的常用方法。
>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                #只有第六个观测

2.7 设置数据框的行名和列名

> 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运算,可提高程序效率。

5.类型转换

  is.dataframe()判断是否为数据框 
    as.dataframe()转换为数据框

R语言编程基础数据框应用

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<pre class="plain" name="code">
      #逻辑向量
> 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语言编程应用》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息