1、截取数据的一部分
在统计分析时,如果希望用观测数据的一部分来进行计算分析,该怎么做呢?
一个办法是用类似访问数组索引的方式,根据索引范围来截取,例如,对一组cpu利用率数据取前6个值:
> cpu1
[1] 0.0 0.0 0.0 0.0 0.0 6.1 3.0 10.5 -10.6 -1.4 5.9 0.1
[13] 9.0 -15.1 -1.5 6.1 7.5 -6.0 -3.1 9.2 -6.2 3.1 -1.5 3.0
[25] -2.9 4.4 -7.5 10.4 -15.0 4.6 -4.5 15.0 -10.5 -4.6 9.0 1.6
[37] -1.5 -4.5 4.6 -3.1 4.5 -7.6 16.7 -21.2 15.1 4.6 -13.6 3.1
[49] -1.7 3.1 -4.6 0.0 24.3 -21.3 -2.9 12.1 -4.6 -4.6 -5.8 3.0
[61] -3.0 -9.2 7.4 9.2 0.2 -7.7 15.2 -18.3 12.1 -1.5 -6.1 1.6
[73] 0.0 -1.5 3.2 -1.7 -3.0 12.2 -1.7 -9.0 -3.1 -1.5 7.5 3.1
[85] 3.0 -0.2 -2.8 0.0 2.9 4.7 -5.9 4.4 -4.6 -6.1 0.3 -12.3
> cpu1[1:6]
[1] 0.0 0.0 0.0 0.0 0.0 6.1
> cpu1[0:6]
[1] 0.0 0.0 0.0 0.0 0.0 6.1
2、排序
> patientID
[1] 1 2 3 4
> order(patientID)
[1] 1 2 3 4
正序排序(由小到大)
> order(-patientID)
[1] 4 3 2 1
> 倒序排序(由大到小)
3、数据剔除
数据剔除使用方括号进行操作。
> patientdata
patientID age status
1 1 25 Poor
2 2 34 Improved
3 3 28 Poor
4 4 52 Improved
(1)使用减号去除
根据列号剔除指定列序号的列。
> patientdata[c(-1)]
age status
1 25 Poor
2 34 Improved
3 28 Poor
4 52 Improved
去除第1列,使用减号,表示去除。
(2)使用逻辑!去除
根据名称剔除指定列名的列。
> patientdata
patientID age status
1 1 25 Poor
2 2 34 Improved
3 3 28 Poor
4 4 52 Improved
> myvars<-names(patientdata) %in% c("age")
> myvars
[1] FALSE TRUE FALSE
> patientdata[!myvars]
4、选入观测
选择要分析的数据列。对数据框、矩阵、数组有效。
(1)利用列号选入
> patientdata
patientID age status
1 1 25 Poor
2 2 34 Improved
3 3 28 Poor
4 4 52 Improved
> patientdata[1:3]
patientID age status
1 1 25 Poor
2 2 34 Improved
3 3 28 Poor
4 4 52 Improved
> patientdata[1:2]
patientID age
1 1 25
2 2 34
3 3 28
4 4 52
> patientdata[1:2,]
patientID age status
1 1 25 Poor
2 2 34 Improved
>
注意:逗号前为行下标,逗号后为列下标,再如:
> patientdata[1:3,1:3]
patientID age status
1 1 25 Poor
2 2 34 Improved
3 3 28 Poor
(2)利用条件选入
例1:
类似SQL语句进行查询,不得不说R语言特别强大。
> patientdata[which(age>30),]
patientID age status
2 2 34 Improved
4 4 52 Improved
>
说明:结果未选取年龄大于30岁的数据,方括号中逗号前为行条件,逗号后为列条件。
例2:
条件选择的等于符号为“==”,而不是“=”。条件
> patientdata
patientID age status
1 1 25 Poor
2 2 34 Improved
3 3 28 Poor
4 4 52 Improved
> patientdata[which(status="Poor"),]
Error in which(status = "Poor") : 参数没有用(status = "Poor")
> patientdata[which(status=="Poor"),]
Error in which(status == "Poor") : 找不到对象'status'
> patientdata[which(patientdata$status=="Poor"),]
patientID age status
1 1 25 Poor
3 3 28 Poor
>
> patientdata[which(patientID=="Poor"),]
[1] patientID age status
<0 行> (或0-长度的row.names)
注意:status可能和系统变量冲突,需要加前缀patientdata$才能正常运行。
(3)利用subset函数选入
> subset(patientdata,age>30)
patientID age status
2 2 34 Improved
4 4 52 Improved
> subset(patientdata,age>30,)
patientID age status
2 2 34 Improved
4 4 52 Improved
> subset(patientdata,age>30 & age<50)
patientID age status
2 2 34 Improved
> subset(patientdata,age>30 & age<50,select=c(age,status))
age status
2 34 Improved
>
说明:第1个参数为待操作变量,第2个参数为过滤条件,select参数为选取的列名。
(4)随机取样
随机取样为抽取行数据,当然也可以选用哪些列参与分析。
> patientdata[sample(1:nrow(patientdata),3,replace=TRUE),]
patientID age status
3 3 28 Poor
4 4 52 Improved
1 1 25 Poor
>
说明:随机选取3行数据,第2个数据为选取行数;1:nrow(patientdata)为行号范围
A.行列统计函数
> nrow(patientdata)
[1] 4
结果为行数。
> ncol(patientdata)
[1] 3
>
结果为列数。
B.采样函数sample
随机选取指定数量的行(行索引)。
> str(sample(1:nrow(patientdata),3,replace=TRUE))
int [1:3] 3 2 2
> str(sample(1:nrow(patientdata),3,replace=FALSE))
int [1:3] 1 3 2
> str(sample(1:nrow(patientdata),3,replace=FALSE))
int [1:3] 4 2 1
> str(sample(1:nrow(patientdata),3,replace=FALSE))
int [1:3] 2 1 4
> str(sample(1:nrow(patientdata),3,replace=FALSE))
int [1:3] 2 3 4
> str(sample(1:nrow(patientdata),3,replace=FALSE))
int [1:3] 3 2 1
> str(sample(1:nrow(patientdata),3,replace=FALSE))
int [1:3] 3 4 2
> str(sample(1:nrow(patientdata),3,replace=FALSE))
int [1:3] 3 1 4
> str(sample(1:nrow(patientdata),3,replace=FALSE))
int [1:3] 4 1 3
> str(sample(1:nrow(patientdata),3,replace=TRUE))
int [1:3] 2 4 4
> str(sample(1:nrow(patientdata),3,replace=TRUE))
int [1:3] 4 1 2
> str(sample(1:nrow(patientdata),3,replace=TRUE))
int [1:3] 1 2 2
>
结果为随机采样到的行号,replace为放入采样,可见,当设置replace为TRUE时,样本重复的几率较大。
C.which函数
返回满足条件的行号。
> patientdata
patientID age status
1 1 25 Poor
2 2 34 Improved
3 3 28 Poor
4 4 52 Improved
> which(patientdata$age>30)
[1] 2 4
结果返回年龄大于30的行号。