美文网首页
R中的对象(上)

R中的对象(上)

作者: xiaoxianyu | 来源:发表于2020-01-13 15:29 被阅读0次

    在R中进行的所有操作都是针对活动内存中的对象的。

    此对象非彼对象。个人理解是我们输入R中的一切是对象,得到的结果是对象,保存到计算机硬盘的也叫对象。所以,用R做分析时,你一直和对象在一起。

    R中最简单的命令就是输入一个对象的名字然后显示其内容

    > a<-10

    > a

    [1] 10

    > print(a)

    [1] 10

    直接输入对象的名字在这里与函数print(x)相同,但是在有些情况下,列入内嵌在一个函数或循环中时,就必须用print()函数了。

    对象的名字必须是以一个字母开头,中间可以包含字母、数字、点(.)及下划线(_)。字母区分大小写,所以A 和a是不一样的。起名的时候不要用保留字,保留字设计程序流程控制和特殊的变量类型,如if,else,repeat,TRUE,FALSE,function,while等。

    R中的对象主要是数据对象,当然也有其他类型的对象。比如说我们在Y用R画图后得到的图像也是对象。但是数据对象永远是我们接触最多的对象。

    数据也有不同的类型,什么向量,数组,矩阵、数据框、列表、因子都是数据类型

    一张图来大概展示一下:

    我们要分析数据,首先要有数据,所以第一步要做的就是数据的创建。数据的创建既可以是手动的输入也可以是导入其他文件形式的数据,比如我们最常用的excel格式数据。

    我们以手动输入为例认识一下各种数据类型

    1向量vector

    vector是用于储存数值型、字符型和逻辑型数据的一组数组。

    单个向量中的数据必须是同一类型的。

    > #输入数值型向量a

    > a<-c(1,2,3)

    > #输入字符型向量b

    > b<-c("one","two","three")

    > #输入逻辑型向量c

    > c<-c(TRUE,TRUE,FALSE)

    除了手动键入所有的数据,还有一些函数可以帮我们输入特定的数值型数据

    #创建向量a为一组连续数值并查看a

    > a<-1:10

    > a

    [1]  1  2  3  4  5  6  7  8  9 10

    从下面的例子中我们可以看到“:”的优先级

    > 1:10-1

    [1] 0 1 2 3 4 5 6 7 8 9

    > 1:(10-1)

    [1] 1 2 3 4 5 6 7 8 9

    还有一个帮助生成等距离序列的函数seq()

    #生成一个从1到5,步长为0.5的序列

    > seq(1,5,0.5)

    [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0

    或者

    #从1到5,数据个数(length)为9的序列

    > seq(length=9,from=1,to=5)

    [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0

    如果我们需要创建重复序列,用到的函数是rep()

    在下面的例子中,我们只是输入函数或表达式而不是把它的结果赋给某个对象,这样只是在窗口中显示结果,而不会被保存在内存中。

    > rep(2:5,times=2)

    [1] 2 3 4 5 2 3 4 5

    > rep(1:3,times=4,each=2)

    [1] 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3

    > rep(2,4)

    [1] 2 2 2 2

    > rep(2:5,rep(2,4))

    [1] 2 2 3 3 4 4 5 5

    > rep(2:5,each=2)

    [1] 2 2 3 3 4 4 5 5

    函数sequence可以创建一系列连续的整数序列,每个序列都以给定参数的数值结尾。

    > sequence(5)

    [1] 1 2 3 4 5

    > sequence(c(10,5))

    [1]  1  2  3  4  5  6  7  8  9 10  1  2  3  4  5

    > sequence(1:3)

    [1] 1 1 2 1 2 3

    在统计学中产生随机序列是很有用的,R可以产生多种不同分不下的随机数序列。

    因为如果没有统计学知识铺垫,很难准确理解这些函数的意义,在这里我们只给出了一个列表。

    2因子factor

    因子是由向量编译过来的,因此它和向量是有区别的。因子的用法如下:

    factor(x = character(), levels, labels = levels,exclude = NA, ordered = is.ordered(x), nmax = NA)

    键入?factor在D区给出的定义是:

    The function factor is used to encode a vector as a factor (the term 'category' and 'enumerated type' are also used for factors.)

    个人理解:因子和向量的不同体现在因子侧重列举或类别,具体体现在因子中的水平(level)上,水平包含所有的不重复的数据类别以及在数据中不出现的数据类别。

    讲了那么多,大家可能还是不清楚,给个例子感受下:

    #创建向量province

    > province <- c("四川", "湖南", "江苏", "四川", "四川", "四川", "湖南", "江苏")

    > province

    [1] "四川" "湖南" "江苏" "四川" "四川" "四川" "湖南" "江苏"

    #创建向量province的因子pf

    > pf <- factor(province)

    > pf

    [1] 四川 湖南 江苏 四川 四川 四川 湖南 江苏

    Levels: 湖南 江苏 四川

    再来些数值型的例子;

    > factor(1:3)

    [1] 1 2 3

    Levels: 1 2 3

    > factor(1:3,levels=1:5)

    [1] 1 2 3

    Levels: 1 2 3 4 5

    > factor(1:3,labels=c("A","B","C"))

    [1] A B C

    Levels: A B C

    > factor(1:3,exclude=4)

    [1] 1 2 3

    Levels: 1 2 3

    函数levels用来提取一个因子中可能的水平值

    > ff<-factor(c(2,4),levels=2:5 )

    > ff

    [1] 2 4

    Levels: 2 3 4 5

    > levels(ff)

    [1] "2" "3" "4" "5"

    有一个很有用的函数gl,能产生规则的因子序列。

    这个函数的用法是gl(k,n),k是水平数或者类别数,n是每个水平重复的次数。length用来指定产生数据的个数,labels用来指定每个水平的名字。

    > gl(3,5)

    [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3

    Levels: 1 2 3

    > gl(3,5,length=30)

    [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3

    Levels: 1 2 3

    > gl(3,5,length=15,label=c("yellow","blue","red"))

    [1] yellow yellow yellow yellow yellow blue   blue   blue   blue   blue   red    red    red    red    red  

    Levels: yellow blue red

    3矩阵matrix

    矩阵是一个二维数组,学过线性代数的小伙伴应该比较熟悉(唉,一直没坚持学会过)

    那么如何创建矩阵呢?

    用函数matrix来创建,用法如下:

    matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)

    其中byrow=FALSE(默认)时,按列填充,byrow=TRUE时,按行填充。

    #创建一个2x2的矩阵

    > matrix(1:4,nrow=2,ncol=2)

         [,1] [,2]

    [1,]    1    3

    [2,]    2    4

    > #生成单位矩阵

    > diag(3)

         [,1] [,2] [,3]

    [1,]    1    0    0

    [2,]    0    1    0

    [3,]    0    0    1

    #创建由1到12排列的矩阵mat1,3行4列,按行填充数值

    > mat1<-matrix(1:12,3,4,byrow=T)

    > mat1

         [,1] [,2] [,3] [,4]

    [1,]    1    2    3    4

    [2,]    5    6    7    8

    [3,]    9   10   11   12

    #创建由1到12排列的矩阵mat1,3行4列,按列填充数值

    > mat2<-matrix(1:12,3,4,byrow=F)

    > mat2

         [,1] [,2] [,3] [,4]

    [1,]    1    4    7   10

    [2,]    2    5    8   11

    [3,]    3    6    9   12

    还有另外一种方法来创建矩阵:给维数适当地赋值。

    > x<-1:15

    > x

    [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15

    > dim(x)

    NULL

    > dim(x)<-c(5,3)

    > x

         [,1] [,2] [,3]

    [1,]    1    6   11

    [2,]    2    7   12

    [3,]    3    8   13

    [4,]    4    9   14

    [5,]    5   10   15

    4数据框data frame

    个然感觉data frame就像我们用的Excel表格。不信来感受一下

    #先对数据框的列向量进行赋值

    > patientID<-c(1,2,3,4)

    > age<-c(25,35,45,56)

    > diabetes <- c("Type1", "Type2", "Type1", "Type1")

    > status <- c("Poor", "Improved", "Excellent", "Poor")

    #创建数据框patientdata

    > patientdata <- data.frame(patientID, age, diabetes, status)

    #显示数据框patientdata

    > patientdata

      patientID age diabetes    status

    1         1  25    Type1      Poor

    2         2  35    Type2  Improved

    3         3  45    Type1 Excellent

    4         4  56    Type1      Poor

    现在只有4行数据,假如我们有成百上千行的数据,但只想查看数据框的列向量有哪些,不希望全部数据信息都显示出来,可以这样:

    #只显示数据框 patientdata前6行数据信息

    > head(patientdata)

    或者

    #只显示数据框 patientdata后6行数据信息

    > tail(patientdata)

    一般情况下数据框中的列向量必须有相同的长度。如果其中一个比其他的短,它将循环整数次以使得其长度与其他列向量相同,否则将报错。

    > x<-1:4; n<-10; M<-c(10,35);y<-2:4

    > data.frame(x,n)

      x  n

    1 1 10

    2 2 10

    3 3 10

    4 4 10

    > data.frame(x,M)

      x  M

    1 1 10

    2 2 35

    3 3 10

    4 4 35

    > data.frame(x,y)

    Error in data.frame(x, y) : 参数值意味着不同的行数: 4, 3

    用函数expand.grid()可以创建一个数据框,把各个向量的各水平进行完全随机搭配。

    > expand.grid(h=c(60,80),w=c(100,300),sex=c("male","female"))

       h   w    sex

    1 60 100   male

    2 80 100   male

    3 60 300   male

    4 80 300   male

    5 60 100 female

    6 80 100 female

    7 60 300 female

    8 80 300 female

    我们也可以对数据框进行一些操作:

    #查看数据框 patientdata1到3列向量的数据信息

    > patientdata[1:3]

      patientID age diabetes

    1         1  25    Type1

    2         2  35    Type2

    3         3  45    Type1

    4         4  56    Type1

    #查看数据框 patientdata中名字为age列向量的数据信息

    > patientdata$age

    [1] 25 35 45 56

    5列表list

    列表就厉害了,是R数据类型中最复杂的一种,可以包含任何类型的数据结构,甚至是它自己。列表就像是一个大货架,还是随便组装的那种。什么都能放进去,小货架也能放。

    > g <- "My First List"

    > h <- c(25, 26, 18, 39)

    > j <- matrix(1:10, nrow = 5)

    > k <- c("one", "two", "three")

    > mylist <- list(title = g, ages = h, j, k)

    > mylist

    $title

    [1] "My First List"

    $ages

    [1] 25 26 18 39

    [[3]]

         [,1] [,2]

    [1,]    1    6

    [2,]    2    7

    [3,]    3    8

    [4,]    4    9

    [5,]    5   10

    [[4]]

    [1] "one"   "two"   "three"

    查看list的数据信息跟之前有一些不一样的地方:

    #查看列表mylist的第一个对象

    > mylist[[1]]

    [1] "My First List"

    #查看列表mylist中名字为title的对象

    > mylist$title

    [1] "My First List"

    除了这些数据类型,还有一些常用的对象

    6时间序列Time-series

    函数ts可以由向量(一元时间序列)或者矩阵(多元时间序列)创建一个时间序列型的对象。用法如下:

    ts(data = NA, start = 1, end = numeric(), frequency = 1,deltat = 1, ts.eps = getOption("ts.eps"), class = , names = )

    下面是用ts创建时间序列的例子

    > ts(1:10,start=1959)

    Time Series:

    Start = 1959

    End = 1968

    Frequency = 1

     [1]  1  2  3  4  5  6  7  8  9 10

    > ts(1:47,frequency=12,start=c(1959,2))

         Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec

    1959       1   2   3   4   5   6   7   8   9  10  11

    1960  12  13  14  15  16  17  18  19  20  21  22  23

    1961  24  25  26  27  28  29  30  31  32  33  34  35

    1962  36  37  38  39  40  41  42  43  44  45  46  47

    > ts(1:10,frequency = 4,start=c(1959,2))

         Qtr1 Qtr2 Qtr3 Qtr4

    1959         1    2    3

    1960    4    5    6    7

    1961    8    9   10   

    > ts(matrix(rpois(36,5),12,3),start=c(1961,1),frequency=12)

             Series 1 Series 2 Series 3

    Jan 1961        6        6        5

    Feb 1961        6        6        5

    Mar 1961        4        5        2

    Apr 1961        5        3        2

    May 1961        4       10        1

    Jun 1961        3        4        3

    Jul 1961        3        7        8

    Aug 1961        4        2        7

    Sep 1961        9        9        6

    Oct 1961        3        5        5

    Nov 1961        9        0        3

    Dec 1961        6        5        5

    7表达式expression

    表达式就是构建数学公式,构建好表达式,输入任意值,就能求解:

    用到的函数是expression()

    > x<-2; y<-2.5;z<-1

    > exp1<-expression(x/(y+exp(z)) )

    > exp1<-expression(x/(y+exp(z)))

    > exp1

    expression(x/(y + exp(z)))

    #用eval()来求解表达式

    > eval(exp1)

    [1] 0.3832679

    参考文献:

    R for beginners

    ucas相关课程课件

    相关文章

      网友评论

          本文标题:R中的对象(上)

          本文链接:https://www.haomeiwen.com/subject/yizgactx.html