我们对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