R中的处理对象就是数据,每个对象包含多个元素。
所有的对象都有两个内在属性:类型和长度。二者可以通过mode和length得到。
类型包括数值、字符、逻辑、复数等。 长度指的是数据中元素的数目。 无论哪种类型,缺失数据总是用NA表示。 无穷数值使用Inf和-Inf表示正负无穷。 非数字表示为NaN(注意NaN仍为数值型)。所有数据按结构可分为向量、因子、数组、矩阵、数据框、时间序列和列表。
1、向量是最简单的一类,就是包含一行数字的变量。其他结构都可以看作由若干向量组成。 2、因子是分类变量,也可以看作是带有分类标签的向量。 3、数组是n维的数据表,矩阵是2维数组。 4、数据框由若干向量和或因子组成,但必须等长。数据框与二维数组或矩阵类似,但在数据框中,行与列的意义是不同的,其中的列表示变量,而行表示观测。显示数据框时左侧会显示观测值的序号。 5、列表可以包含任何对象。向量的下标
1、正整数:如x[c(1,4)]即x中第一个和第四个元素。注意下标从1开始计数,而不是从0开始。 2、负整数:如x[-(1:3)]即去除x中前三个元素。 3、字符串:需要向量中的元素具有names属性。 例:x=1:3; names(x)=c('a','b','c'); x[c('a','c')] 4、条件选取:可在下标中设置条件来选取合适的元素。 例:x=runif(10); x[x<0.5] #和length联用可用于条件计数,如length(x[x>0.8]) 例:x[x %in% y] #选取x和y相同的元素。x %in% y返回和x等长的一个逻辑值向量因子的建立:可以使用factor或gl
每一个因子不仅包括若干元素,还包括该因子所有可能的取值水平。 1、factor(x) 用于转换向量为因子,默认将向量中所有不同元素的种类排序后列为因子标签。 例:x=1:4; y=factor(x) #factor不直接修改x的值 2、gl(k,n,length=,label=) 构造一个因子序列。k为水平数,n为每个水平连续出现的次数,length为整个序列的长度,label为因子标签。 例:gl(3,5,length=20,label=c('a','b','c')) 3、levels用于提取因子中的标签,也可用于修改因子标签。 例:levels(x); levels(x)=2:5 注意:使用levels修改因子标签后,因子中的元素也会发生相应改变。数组的建立
1、array(data, dim, dimnames) data为一向量,其元素用于构建数组;dim为数组的维数向量(表明各维所包含的元素个数);dimnames为由各维的名称构成的向量,缺省为空。 例:x=array(1:24, dim=c(3,4,2)) 如果data中元素不足于填充整个数组,则会使用循环原则填充数组。 例:x=array(1:5, dim=c(3,4,2)) 2、dim可以将向量转为数组 例:y=1:24; dim(y)=c(3,4,2) #dim直接修改了y的值 注意:dim不能使用循环原则填充,同时注意和factor的区别。 3、dimnames可以对维度进行命名,但必须用列表形式。 例:x=array(1:24, dim=c(3,4,2)); dimnames(y)=list(c('a','b','c'), c('a','b','c','d'), c('a','b')) 4、dim和dimnames也可以用于查看数组的相关属性 例:x=array(1:24, dim=c(3,4,2),dimnames=list(c('a','b','c'), c('a','b','c','d'), c('a','b'))); dim(x); dimnames(x)矩阵的建立
1、矩阵可以视为2维数组,因此可用array来建立。 2、matrix是专用的建立矩阵的函数 例:x=matrix(1, nr=2, nc=2); y=matrix(1:4, 3, 4) 注意:循环填充也适用于matrix,但当矩阵所需元素个数不是向量中元素个数的整倍数时,会出现警告信息。 3、对角矩阵可使用diag建立 例:diag(3); diag(1:5); diag(4,3); diag(4,3,5) 4、可用rownames和colnames查看或命名矩阵的行变量名和列变量名。 例:rownames(x); colnames(x)=c('a','b') 注意:dim和dimnames也同样适用于矩阵 5、使用matrix建立矩阵,默认为按列填充,可使用byrow=TRUE进行按行填充。 例:matrix(1:6, 3, 4, byrow=TRUE) 注意:byrow对array和diag无效。数组和矩阵的下标
1、和向量一样,下标可以选择正整数、负整数、字符串和条件式 例:x=matrix(1:6, 3, 4); x[2,2]; x[c(1,2),c(3,4)]; x[,3]; x[1,] 2、负整数只能去除整行或整列,不能抠去某个元素 例:x[,-2]; x[-1,-2] 3、条件式下标 例:x=matrix(1:20,4); x[x>7] #[1] 8 9 10 11 12 13 14 15 16 17 18 19 20 x[,x[1,]>2] #第一行大于2的所有列 x[x[,2]>7,] #第二列大于7的所有行,注意此时只有最后一行符合要求,默认返回值为一个向量 x[x[,2]>7,,drop=F] #使用drop参数使返回值保持矩阵类型 4、当各维度具有names属性时,可使用字符串下标。 例:x=matrix(1:4,2,2); colnames(x)=c('a','b'); rownames(x)=c('a','b'); x['a','b'] 5、避免矩阵的意外降维(注意下标里的逗号) 例:x=matrix(1:6,3) y=x[1,] #此时y成为一个长度为2的向量 y=x[3,,drop=FALSE] #此时y为只有一行的矩阵 y=x[,1,drop=FALSE] #此时y为只有一列的矩阵数据框的建立
1、可通过data.frame将若干向量组成数据库,但向量必须有相同的长度或长度有倍数关系,如果其中有一个比其它 的短,它将按循环法则“循环”整数次。 例:x=1:10; y=20:11; z=data.frame(x,y) 2、可以使用colnames或names查看或更改列变量名。rownames可以查看或修改行变量名 3、添加新变量 #向量、数组、矩阵可以使用字符串下标,但不能使用$符号 3.1 直接添加。例:z$a=rnorm(10); z$b=1/x 3.2 使用with。例:z$b=with(z, 1/x) 3.3 使用transform一次添加多个变量。例:z=transform(z, a=1/x, b=1/y)数据框子集的选择
1、可以使用下标的方式,使用方法与数组下标相同。 2、对于数据框中的列,可直接使用“数据框名$变量名”这种格式指向对应的列。 例:x=1:10; y=20:11; z=data.frame(x,y); z$x 3、使用subset,根据条件选取 例:x=rnorm(10); y=rnorm(10); z=data.frame(x,y); subset(z, x>0 & y<0)列表的建立
1、使用list,和data.frame相似,但对参数无限制。 例:x=1:20; y=gl(3, 5, length=16); z=diag(4); r=list(x, y, z) 2、使用下标时,注意列表有两级下标。 由于列表可以包含任何元素,因此仅用单层[]难以表达数据位置,因此使用[[i]]表示数据的层级关系。 例:r[[3]][1,1] #该数据在第二层第一行第一列,第一层第三个元素中。 例:r[[2]][[3]][2,3] #该数据在第三层第二行第三列,第二层第三个元素,第一层第二个元素中。 双层方括号里也可以放变量名 例:r[['a']][['b']][2,3] #该数据在第三层第二行第三列,第二层变量b中,第一层变量a中。 3、当建立列表时命名了第一级下标的名称,则可以使用“列表名$变量名” 例:r=list(a=x, b=y, c=z); r$a; r$c[1,] 也可以在建立列表之后再修改names属性 例:names(r)=letters[c(24:26)] 4、实际数据分析时,主要是提取列表部分数据以向量、列表、数组、矩阵或数据框的形式进行分析。附:
1、查看对象的性质可以使用mode、attributes、typeof、class等函数。 2、使用attr可查看数据结构。 3、利用subset筛选数据(略过NA) x=c(1:3,NA) x[x>2] #输出“[1] 3 NA” subset(x,x>2) #输出“[1] 3” 4、利用which获取符合元素的下标 x=6:10; which(x %% 2 == 0) #输出“[1] 1 3 5” 5、将列表所有元素转成一个向量 unlist()