R中的对象(中)

我们对R中的数据类型对象有了一定的了解,接下来就是对数据对象的简单操作。在excel里我们可以通过鼠标来实现,在R里我们通过输入代码来实现。

在处理数据量较大的数据时,用R是很方便的,不用做大量的重复性工作。


1运算符

在介绍对数据元素的操作之前我们先来认识一下运算符,这个从幼儿园就开始接触到的东西显得格外亲切。

R中主要有三种运算符:数学运算符、比较运算符和逻辑运算符。


需要注意的是像0


>x<-0.5

> 0

Error: unexpected '<' in "0

> 0

[1] TRUE


为了整体比较两个对象,可以使用两个函数identical和all.equal


> x<-1:3; y<-1:3

> x==y

[1] TRUE TRUE TRUE

> identical(x,y)

[1] TRUE

> all.equal(x,y)

[1] TRUE


这里需要注意的是,在R里,“=”意思是赋值,作用相当于<-,并不是我们数学上学到的=


> x<-2

> x

[1] 2

> x=3

> x

[1] 3


identical比较数据的内在关系,如果对象是严格相同的返回TRUE。all.equal用来判断两个对象是否近似相等。如果近似相等返回结果TRUE或者对二者差异的描述。all.equal在比较数值变量时考虑到了计算过程中的近似。


> 0.9==(1-0.1)

[1] TRUE

> identical(0.9,1-0.1)

[1] TRUE

> all.equal(0.9,1-0.1)

[1] TRUE

> 0.9==(1.1-0.2)

[1] FALSE

> identical(0.9,1.1-0.2)

[1] FALSE

> all.equal(0.9,1.1-0.2)

[1] TRUE

> all.equal(0.9,1.1-0.1)

[1] "Mean relative difference: 0.1111111"


2访问一个对象的数值-下标系统

下标系统可以用来选择性地获取和改变一个对象中的元素

以最简单的向量为例:


> x<-1:5

> x[2]

[1] 2

> x[2]<-20

> x

[1]  1 20  3  4  5


下标本身也可以是一个数值型的向量;


> i<-c(1,3)

> x[i]

[1] 1 3


获取元素有很多种操作:


> a<-c(1,2,3,4,5,6)

> #查看向量a中的第3个数据

> a[3]

[1] 3

> #查看向量a中的第1、3、5个数据

> a[c(1,3,5)]

[1] 1 3 5

> #查看向量a中的第2到6个数据

> a[2:6]

[1] 2 3 4 5 6

> #查看向量a中大于3的数据

> a[a>3]

[1] 4 5 6

> #去掉第一个数据

> a[-1]

[1] 2 3 4 5 6

> #去掉前3个数据

> a[-1:-3]

[1] 4 5 6


如果我们要获取和改变矩阵中的数据元素,是这样的:


> #创建矩阵x

> x<-matrix(1:6,2,3)

> #查看矩阵x第2行第2列的数据

> x[2,2]

[1] 4

> #查看矩阵x第2行所有的数据

> x[2,]

[1] 2 4 6

> #查看矩阵x第 2列所有的数据

> x[,2]

[1] 3 4

> #查看矩阵x第 2行,第2、3列的数据

> x[2,c(2,3)]

[1] 4 6


如果对象是数据框,操作是这样的:


> 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

#查看数据框 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


我们可以看到在查看矩阵和数据框某一列向量的数据元素时,得到的结果是向量而不是矩阵或数据框。这是因为R的默认规则返回一个维数尽可能低的对象。我们可以通过修改选项drop的默认值来改变:


> x<-matrix(1:6,2,3)

> x

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

[1,]    1    3    5

[2,]    2    4    6

> x[,3,drop=F]

     [,1]

[1,]    5

[2,]    6


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


> 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"

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

> mylist[[1]]

[1] "My First List"

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

> mylist$title

[1] "My First List"

#查看第3个对象的第2列第2、4行的元素

> mylist[[3]][c(2,4),2]

[1] 7 9


3访问对象的名字

names是一个对象元素的字符型标签,就像我们每个人的名字一样。

names是一个和对象有同样长度的向量,可以通过函数names来访问


> mylist[[3]][c(2,4),2]

[1] 7 9

> x<-1:3

> names(x)

NULL

> names(x)<-c("a","b","c")

> names(x)

[1] "a" "b" "c"

> x

a b c

1 2 3

> names(x)<-NULL

> x

[1] 1 2 3


对于矩阵和数据框,colname和rowname分别是行和列的标签。


> x<-matrix(1:4,2)

> rownames(x)<-c("A","B")

> colnames(x)<-c("C","D")

> x

  C D

A 1 3

B 2 4


> dimnames(x)

[[1]]

[1] "A" "B"


[[2]]

[1] "C" "D"


对于数组(array)也可以用dimnames来访问各维的名字

在讲数据类型的时候我们没有说到数组,个人感觉数组就是加了Z轴(三维的)矩阵。


> A<-array(1:8,dim=c(2,2,2))

> A

, , 1


     [,1] [,2]

[1,]    1    3

[2,]    2    4


, , 2


     [,1] [,2]

[1,]    5    7

[2,]    6    8


> dimnames(A)<-list(c("A","B"),c("C","D"),c("E","F"))

> A

, , E


  C D

A 1 3

B 2 4


, , F


  C D

A 5 7

B 6 8


4 数据编辑器

我们亦可以打开一个类似Excel表格的图像编辑器去编辑数据对象。


> x<-matrix(1:10,2,5)

> x

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

[1,]    1    3    5    7    9

[2,]    2    4    6    8   10

#弹出编辑器的命令

> data.entry(x)

or

> fix(x)


5简单运算

在R中有很多用来处理数据的函数,最简单的就是c,用来连接在()里的对象。


> c(1:5,seq(10,11,0.2))

[1]  1.0  2.0  3.0  4.0  5.0 10.0 10.2 10.4 10.6 10.8 11.0


向量也可以进行简单的算术运算


> x<-1:4

>  y<-rep(1,4)

> x

[1] 1 2 3 4

> y

[1] 1 1 1 1

> z<-x+y

> z

[1] 2 3 4 5


上面展示了相同长度的向量相加,不同长度的向量也可以相加。最短的向量将被循环使用。


> x<-1:4

> y<-1:2

> z<-x

> z

[1] 2 4 4 6

> y<-1:3

> x<-1:4

> z<-x+y

Warning message:

In x + y : longer object length is not a multiple of shorter object length

> z

[1] 2 4 6 5


这不是一个错误报警,而是警告报警,因为y没有完全循环。


如果想对一个向量中所有的元素乘以相同的数,


> x<-1:4

> y=10

> z=x*y

> z

[1] 10 20 30 40


在R中有很多基本的数学函数可以调用:


#求数值向量x的绝对值

> x<-1:10

#求向量x数据的绝对值

> abs(x)

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

#求向量x数据的平方根

> sqrt(x)

[1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751 2.828427 3.000000 3.162278

#求向量x数据的不小于它的最小整数

> ceiling(x)

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

#求向量x数据的不大于它的最大整数

> floor(x)

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

##求向量x数据的均值

> mean(x)

[1] 5.5

#求向量x数据的中值

> median(x)

[1] 5.5

#求向量x数据的标准差

> sd(x)

[1] 3.02765

#求向量x数据的方差

> var(x)

[1] 9.166667

#显示向量x数据的范围

> range(x)

[1]  1 10

#求向量x数据的和

> sum(x)

[1] 55

#显示向量x数据的最小值和最大值

> min(x)

[1] 1

> max(x)

[1] 10

#10以5为底的对数

> log(10,base=5)

[1] 1.430677

#10的自然对数

> log(10)

[1] 2.302585

#指数函数

> exp(2.3026)

[1] 10.00015

#常用对数

> log10(10)

[1] 1

#2.35取整

> trunc(2.35)

[1] 2


除了对向量数据进行简单的运算,我们也可以在数据框中调用一些基本的数学函数进行运算。


#创建数据框mydata

>mydata<-data.frame(x1=c(2,2,4,6),x2=c(3,4,2,8))

#增加列向量:数据的总和和平均值

> mydata$sum<-mydata$x1+mydata$x2

>mydata$mean<-( mydata$x1+mydata$x2)/2

> mydata

  x1 x2 sum mean

1  2 3   5  2.5

2  2 4   6  3.0

3  4 2   6  3.0

4  6 8  14  7.0


或者这样


> mydata<-data.frame(x1=c(2,2,4,6),x2=c(3,4,2,8))

> mydata<-transform(mydata,sum=x1+x2,mean=(x1+x2)/2)

> mydata

  x1 x2 sum mean

1  2  3   5  2.5

2  2  4   6  3.0

3  4  2   6  3.0

4  6  8  14  7.0


#删除列变量mean

> mydata$mean<-NULL

> mydata

  x1 x2 sum

1  2  3   5

2  2  4   6

3  4  2   6

4  6  8  14


6缺失值的检测

我们在用excel的时候也知道,在进行数值运算时,缺失值(NA, Not Available)并不等于0。除了缺失值,还有NAN(Not a Number,非数值)。

在处理数据前我们一般要检测缺失值是否存在

> x <-  c(1:3, 5,7, NA, 9)

> is.na(x)

[1] FALSE FALSE  FALSE FALSE FALSE  TRUE FALSE

> sum(x)

[1] NA

> sum( x,  na.rm = T )

[1] 27


7数据类型之间的转化

数据类型之间是可以进行相互转化的

转化之前我们先要明确当前的数据类型,通过下面的命令进行判断:


> is.numeric(x)

[1] TRUE

> is.character(x)

[1] FALSE

> is.logical(x)

[1] FALSE

> is.vector(x)

[1] TRUE

> is.data.frame(x)

[1] FALSE

> is.factor(x)

[1] FALSE

> is.matrix(x)

[1] FALSE


在这里X是一个数值型的向量,我们可以把它转换成字符型向量y:


> y<-as.character(x)

> y

[1] "1" "2" "3" "5" "7" NA  "9"


8排序功能


我们有的时候也会用到排序的功能,比如根据某一列向量数据的数值大小排序


> df <- data.frame (id = 1:4,

+                   weight = c(20, 27, 24, 22),

+                   size = c("small", "large", "medium", "large"))

> order(df$weight)

[1] 1 4 3 2

> df[order(df$weight),]

  id weight   size

1  1     20  small

4  4     22  large

3  3     24 medium

2  2     27  large

#根据列向量weight的数据将weight、size两个列向量从大到小排列

> df[order(df$size,-df$weight),]

  id weight   size

2  2     27  large

4  4     22  large

3  3     24 medium

1  1     20  small

#根据列向量weight的数据将weight、size两个列向量从小到大排列(默认)

> df[order(df$size,df$weight),]

  id weight   size

4  4     22  large

2  2     27  large

3  3     24 medium

1  1     20  small

注意,默认情况下使用order的功能,第一列的数据会自动排序,但后面几列的数据不会。

除此之外,我们还可以使用plyr包中的arrange函数


> library(plyr)

> arrange(df,weight)

  id weight   size

1  1     20  small

2  4     22  large

3  3     24 medium

4  2     27  large

> arrange(df,size,weight)

  id weight   size

1  4     22  large

2  2     27  large

3  3     24 medium

4  1     20  small

> arrange(df,size,-weight)

  id weight   size

1  2     27  large

2  4     22  large

3  3     24 medium

4  1     20  small


除了按照数据框中的列向量的数据数值进行排序,我们也可以自己指定。


> A<-1:4

> B<-c("小明","小王","小李","小张")

> mydata<-data.frame(A,B)

> mydata

  A    B

1 1 小明

2 2 小王

3 3 小李

4 4 小张

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

> mydata[order(gg),]

  A    B

2 2 小王

1 1 小明

4 4 小张

3 3 小李


这时,所有的列向量都会按给定的排序排列。

参考资料:

R for beginners

你可能感兴趣的:(R中的对象(中))