3 数组
数组类似于矩阵,其维度可以大于2.数组可以通过array函数创建,形式如下:
> setarray <- array(vector,dimensions,dimnames)
其中,vector包含了数组中的数据;dimensions是一个数值型向量,给出了各维度下标的最大值;而dimensions是可选的、各维度名称标签的列表。
举个例子:
> dim1 <- c("x1","x2")
> dim2 <- c("y1","y2","y3")
> dim3 <- c("z1","z2","z3","z4")
> xyz <- array(1:24,c(4,3,2),dimnames=list(dim3,dim2,dim1))
> xyz
, , x1
y1 y2 y3
z1 1 5 9
z2 2 6 10
z3 3 7 11
z4 4 8 12
, , x2
y1 y2 y3
z1 13 17 21
z2 14 18 22
z3 15 19 23
z4 16 20 24
从数组中选取元素的方法与矩阵相同 例:
> xyz[1,2,] //取x1,x2两个维度下y2 z1下的元素
x1 x2
5 17
> xyz[1,3,]
x1 x2
9 21
> xyz[,2,2]
z1 z2 z3 z4
17 18 19 20
> xyz[3,2,1]
[1] 7
4 数据框
我们知道矩阵只能够存入相同模式的数据。而当我们想要存储不同模式的数据时就需要使用到我们的数据框。数据框可以通过函数data。frame()创建:
格式如下:
mydata <- data.frame(col1,col2,col3,……)
//其中的列向量col1,col2……可以为任何类型
举个例子:
> IDnumber <- c(101,102,103,104)
> age <- c(24,78,56,45)
> hypertention <- c("yes","no","no","yes")
> severity <- c("high","middle","low","middle")
> patientdata <- data.frame(IDnumber,age,hypertention,severity)
> patientdata
IDnumber age hypertention severity
1 101 24 yes high
2 102 78 no middle
3 103 56 no low
4 104 45 yes middle
选取数据框中的元素有很多种,例如下:
> patientdata[1] //引用数据框中的第一列
IDnumber
1 101
2 102
3 103
4 104
> patientdata["age"] //引用age列
age
1 24
2 78
3 56
4 45
> patientdata[1:2] //引用第一列到第二列
IDnumber age
1 101 24
2 102 78
3 103 56
4 104 45
> patientdata[c("age","severity")] //引用age列和severity列
age severity
1 24 high
2 78 middle
3 56 low
4 45 middle
> patientdata$age //利用$符号来引用数据框中的元素
[1] 24 78 56 45
//"$"符号是新出现的使用方法,它被用来选取一个给定数据框中的某个特定变量。
在引用数据框中的某些元素时,每次引入都需要输入数据框的名称会令人生厌。我们可以联合使用函数attach()和detach(),或者单独使用函数with()来简化代码。
(1)attach() 可以姜数据框添加到R的搜索路径中。当R遇到一个变量名以后,将检查搜索路径中的数据框,以定位到这个变量。
//使用以下代码获取年龄(age)变量的描述性统计量,并分别绘制此变量与收缩压的散点图。
> systolic <- c(120,130,140,150,160)
> age <- c(20,30,40,50,55)
> hypertension <- data.frame(systolic,age)
> hypertension
systolic age
1 120 20
2 130 30
3 140 40
4 150 50
5 160 55
> summary(hypertension$age)
Min. 1st Qu. Median Mean 3rd Qu. Max.
20 30 40 39 50 55
> summary(hypertension$systolic)
Min. 1st Qu. Median Mean 3rd Qu. Max.
120 130 140 140 150 160
> plot(hypertension$systolic,hypertension$age)
> attach(hypertension)
The following objects are masked _by_ .GlobalEnv: //显示搜索路径中已经存在hypertension这一数据框
age, systolic
> summary(age)
Min. 1st Qu. Median Mean 3rd Qu. Max.
20 30 40 39 50 55
> summary(systolic)
Min. 1st Qu. Median Mean 3rd Qu. Max.
120 130 140 140 150 160
> plot(systolic,age)
> detach(hypertension) //detach()用于将数据框从搜索路径中移除。detach并不会对数据框本身作任何处理,这句话是可以省略的。
当名称相同的对象不止一个时,这种方法就会显现出它的局限性,原始对象将有限进行运算。函数attach()和detach()最好在分析一个单独的数据框时使用,并且不太可能有多规格同名对象时使用。
(2)with()函数
使用with()函数,也可以实现上述实例:
>with (hypertension,{
+ summary(age)
+ summary(systolic)
+ plot(systolic,age)
}) //此格式不能不能更改,否则报错
//错误格式:
> with (hypertension,{summary(age) summary(systolic) plot(systolic,age)})
错误: unexpected symbol在"with (hypertension,{summary(age) summary"里
注意:
大括号{}之间的语句都针对数据框hypertension执行,这样就不用翻新名称冲突了。如果只有一条语句,大括号可以省略。函数with()的局限性在于赋值仅在此函数的括号内生效。
代码如下:
>with (hypertension,{stat <- summary(age)
+ stat})
Min. 1st Qu. Median Mean 3rd Qu. Max.
20 30 40 39 50 55
> stat
错误: 找不到对象'stat'
如果想要实现创建在with()结果外的对象,需要使用特殊赋值符号"<<-"代替标准赋值符号"<-",它可以将对象保存到with()之外的全局环境中。
举个例子:
> with(hypertension,{nonstat <- summary(systolic)
+ stat <<-summary(systolic)
+ })
> nonstat
错误: 找不到对象'nonstat'
> stat
Min. 1st Qu. Median Mean 3rd Qu. Max.
120 130 140 140 150 160