数组(array)与矩阵类似,但维度可以大于2.
myarray<-array(vector,dimensions,dimnames)> dim1<-c("A1","A2")
> dim2<-c("B1","B2","B3")
> dim3<-c("C1","C2","C3","C4")
> Z<-array(1:24,c(2,3,4),dimnames=list(dim1,dim2,dim3));
> Z
, , C1
B1 B2 B3
A1 1 3 5
A2 2 4 6
, , C2
B1 B2 B3
A1 7 9 11
A2 8 10 12
, , C3
B1 B2 B3
A1 13 15 17
A2 14 16 18
, , C4
B1 B2 B3
A1 19 21 23
A2 20 22 24
由于不同的列可以包含不同模式(数据行、字符型),数据框的概念较矩阵来说更为一般。数据框可以通过函数data.frame()来实现。
mydata<-data.frame(col1,col2,col3,...)
> patientID<-c(1,2,3,4)
> age<-c(25,34,28,52)
> diabetes<-c("Type1","Type2","Type1","Type1")
> status<-c("Poor","Improved","Excellent","Poor")
> patientdata<-data.frame(patientID,age,diabetes,status)
> patientdata
patientID age diabetes status
1 1 25 Type1 Poor
2 2 34 Type2 Improved
3 3 28 Type1 Excellent
4 4 52 Type1 Poor
> patientdata[1:2]
patientID age
1 1 25
2 2 34
3 3 28
4 4 52
> patientdata[c("diabetes","status")]
diabetes status
1 Type1 Poor
2 Type2 Improved
3 Type1 Excellent
4 Type1 Poor
> patientdata$age
[1] 25 34 28 52
"$"的作用是选取一个给定数据框中的某个特定变量。例如你想生成糖尿病类型变量中diabetes和病情变量status的列连边,使用一下代码即可:
> table(patientdata$diabetes,patientdata$status)
Excellent Improved Poor
Type1 1 0 2
Type2 0 1 0
每个变量名前都键入一次patientdata$可能会让人生厌,所以不妨走一些捷径。可以联合使用函数attach()和detach()或单独使用函数with()来简化代码。
代码:
> summary(mtcars$mpg)
> plot(mtcars$mpg,mtcars$disp)
> plot(mtcars$mpg,mtcars$wt)
可以替换成:
> attach(mtcars)
> summary(mpg)
> plot(mpg,disp)
> plot(mpg,wt)
> detach(mtcars)
当名称相同的对象不止一个时,这种方法的局限性就很明显了。
> mpg<-c(25,36,47)
> attach(mtcars)
The following object is masked _by_ .GlobalEnv:
mpg
> plot(mpg,wt)
Error in xy.coords(x, y, xlabel, ylabel, log) :
'x' and 'y' lengths differ
> mpg
[1] 25 36 47
这里,在数据框mtcars被绑定(attach)之前,我们的环境中已经有一个名为mpg的对象。在这种情况下,原始对象取得优先权,这与你想要的结果有所出入。由于mpg中有3个元素而disp中疣32个元素,故plot语句出错。attach()和detach()最好在你分析一个单独的数据框,并且不太可能有多个同名对象市使用。在任何情况下都要当心那些告知某个对象已经被屏蔽(masked)的警告。
with()
> with(mtcars,{summary(mpg,disp)
+ plot(mpg,disp)
+ plot(mpg,wt)
+ })
>
在这种情况下,大括号{}之间的语句都是针对数据框mtcars执行,这样就无需担心名称冲突了,如果仅有一条语句(例如summary(mpg))
函数with()的局限性在于,复制仅在此函数的括号内生效。考虑以下代码:
> with(mtcars,{
+ stats<-summary(mpg)
+ stats
+ })
Min. 1st Qu. Median Mean 3rd Qu. Max.
10.40 15.42 19.20 20.09 22.80 33.90
> stats
Error: object 'stats' not found
如果你需要创建在with()结构意外存在的对象,使用特殊赋值符<<-代替标准赋值符(<-)即可,它可将对象保存到with()之外的全局环境中。这一点可通过以下代码阐明:
> with(mtcars,{
+ nokeepstates<-summary(mpg)
+ keepstats<<-summary(mpg)
+ })
> nokeepstats
Error: object 'nokeepstats' not found
> keepstats
Min. 1st Qu. Median Mean 3rd Qu. Max.
10.40 15.42 19.20 20.09 22.80 33.90
实例标识符
在病例数据中,病人编号(patientID)用于区别数据集中不同的个体。在R中,实例标识符(case identifier)可通过数据框操作函数中的rowname选项指定。例如:
patientdata<-data.frame(patientID,age,diabetes,status,row.names=patientID)
浙公网安备 33010602011771号