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

                              修身,齐家,治国,平天下。

                                     《大学》孔子

                   人生的价值,并不是用时间,而是用深度去衡量的。

                                               -- 列夫·托尔斯泰                                                                              

      转载来源: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语言编程应用》

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
R语言初级教程是为初学者设计的教程,旨在帮助他们快速上手并掌握R语言的基本知识和技能。教程主要包括以下内容: 1. R语言简介:介绍R语言的背景、特点以及在数据分析和统计学中的应用。同时还会介绍R语言的发展历程和使用前景,让学习者对R语言有一个整体的认识。 2. R语言安装与设置:讲解如何下载、安装和设置R语言的开发环境,以便能够顺利运行R语言,并使用相应的工具和包来进行数据分析和可视化。 3. R语言基础语法:介绍R语言的基本语法规则和常见数据结构,如向量、矩阵、数组、数据等。学习者会了解如何创建、修改、存储和调用这些数据结构,并进行相应的计算操作。 4. R语言数据操作:教导学习者如何导入和导出数据,及如何对数据进行清洗、整理和转换。还包括数据筛选、排序、合并、分组、汇总等数据操作技巧。 5. R语言统计分析:介绍如何使用R语言进行常见的统计分析,如描述统计、假设检验、方差分析、回归分析等。学习者会学习如何进行数据可视化,并用统计图表来展示分析结果。 6. R语言编程:引导学习者学习R语言编程风格和技巧,掌握条件语句、循环语句、函数定义等编程基础知识。还会介绍常用的编程技巧和调试方法,帮助学习者提高编程效率和代码质量。 通过这个初级教程,学习者可以逐步掌握R语言的基本知识和技能,为进一步深入学习和应用R语言打下坚实的基础

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值