我们对R中的数据类型对象有了一定的了解,接下来就是对数据对象的简单操作。在excel里我们可以通过鼠标来实现,在R里我们通过输入代码来实现。
在处理数据量较大的数据时,用R是很方便的,不用做大量的重复性工作。
1运算符
在介绍对数据元素的操作之前我们先来认识一下运算符,这个从幼儿园就开始接触到的东西显得格外亲切。
R中主要有三种运算符:数学运算符、比较运算符和逻辑运算符。
需要注意的是像0<x<1这种类型的不等式需要使用逻辑运算符“逻辑与”,改写成0<x & x<1。
>x<-0.5
> 0<x<1
Error: unexpected '<' in "0
> 0<x & x<1
[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