Squid=read.table(file="squid.txt",header=TRUE)
Squid$Sex
factor(Squid$Sex) #试输出Squid$Sex和factor(Squid$Sex),两者的区别在于factor命令会多输出一行,Levels: 1 2,说明Sex有两个水平,1和2
Squid$fSex=factor(Squid$Sex) #将factor(Squid$Sex)存放到一个新的变量fSex中,在变量名前使用f用以表示它是名义变量,也被称为因子
Squid$fSex=factor(Squid$Sex,levels=c(1,2),labels=c("M","F")) #将因子fSex中的1,2转换为M,F
#将所有1和2转换为M和F后再用str命令查看数据框Squid,对比两次Squid发现框中多了fSex因子
查看Squid中的fSex因子:已经由原来的1,2转换为M,F了
使用fSex因子:
SquidM=Squid[Squid$fSex=="M",] #同时对比使用Sex变量SquidM=Squid[Squid$Sex==1,]
注:在这里,直接输入Squid$fSex不用加入factor即可显示出factor(Squid$Sex)的效果(在输出所有元素后额外显示多一行Levels: M F用以告诉我们fSex由两个水平M和F)why?
第四章 简单的函数
4.1 tapply函数
setwd("d:/RBook")
Veg=read.table(file="Vegetation2.txt",header=TRUE)
names(Veg) #查看Veg中所有的变量名
4.1.1计算每个时间截面的均值
注意这里需要用到两个变量
m=mean(Veg$R)
m1=mean(Veg$R[Veg$Transect==1])
m2=mean(Veg$R[Veg$Transect==2])

m3=mean(Veg$R[Veg$Transect==3])
m4=mean(Veg$R[Veg$Transect==4])
m5=mean(Veg$R[Veg$Transect==5])
m6=mean(Veg$R[Veg$Transect==6])
m7=mean(Veg$R[Veg$Transect==7])
m8=mean(Veg$R[Veg$Transect==8])
c(m,m1,m2,m3,m4,m5,m6,m7,m8)
#变量m表示所有8个时间截面的平均丰富度,m1到m8表示每个时间截面的平均丰富度
注:mean使用的对象是数据向量Veg$R,它不是一个矩阵!!所以不在方括号之间加入逗号。
4.1.2更高效地计算每个时间截面的均值
无论是tapply函数、lapply函数还是sapply函数,都是对其变量中的所有数据进行操作
使用tapply函数(用于分组统计)可以完成上面从m1到m8的操作
Veg$Transect [47] 7 7 7 7 7 7 8 8 8 8 8 8
Veg$R
5 8 6 6 6 6 6 7 10 8 18 12 11 7 10 8 9 6 12 13 10 8 8 13
[32] 16 9 14 11 13 11 12 9 10 14 14 10 14 9 12 11 12 14 9 5 12 9 10 16 12 10 14
tapply(Veg$R,Veg$Transect,mean)
1 2 3 4 5 6 7 8
7.571429 6.142857 10.375000 9.250000 12.375000 11.500000 10.500000 11.833333
#tapply函数根据第二个变量(Transect)的不同水平(截面的不同)对第一个变量(R)进行求均值运算
使用tapply函数还可以其求其他数值
>Me=tapply(Veg$R,Veg$Transect,mean)
>Sd=tapply(Veg$R,Veg$Transect,sd) #求标准差
>Le=tapply(Veg$R,Veg$Transect,length) #求长度
>cbind(Me,Sd,Le)
Me Sd Le
1 7.571429 1.3972763 7
2 6.142857 0.8997354 7
3 10.375000 3.5831949 8
4 9.250000 2.3145502 8
5 12.375000 2.1339099 8
6 11.500000 2.2677868 8
7 10.500000 3.1464265 6
8 11.833333 2.7141604 6
4.2sapply函数和lapply函数
>sapply(Veg[,5:9],FUN=mean) #为了节省空间只去第五到第九的变量,因选择的是列所以5:9在,后
R ROCK LITTER ML BARESOIL
9.965517 20.991379 22.853448 1.086207 17.594828 #求出这五个向量中数据的均值
注:tapply函数计算的是一个变量观察值子集的均值,而lapply和sapply函数计算的是一个变量或多个变量全部观察值的均值。FUN代表函数(function),必须大写
lapply和sapply的区别在于输出的不同:
>lapply(Veg[,5:9],FUN=mean)
$R
[1] 9.965517
$ROCK
[1] 20.99138
$LITTER
[1] 22.85345
$ML
[1] 1.086207
$BARESOIL
[1] 17.59483
#lapply函数输出的是一个列表,而sapply输出的是一个向量:
>sapply(Veg[,5:9],FUN=mean)
R ROCK LITTER ML BARESOIL
9.965517 20.991379 22.853448 1.086207 17.594828
4.3summary函数:统计变量信息的函数
>Z=cbind(Veg$R,Veg$ROCK,Veg$LITTER)
>colnames(Z)=c("R","ROCK","LITTER") #由于在cbind的过程中会丢失变量标签(下面的方法就不会)所以重新添加 summary(Z) # 三行代码也可用summary(Veg[,c("R","ROCK","LITTER")])或summary(Veg[,c(5,6,7)])
R ROCK LITTER
Min. : 5.000 Min. : 0.00 Min. : 5.00
1st Qu.: 8.000 1st Qu.: 7.25 1st Qu.:17.00
Median :10.000 Median :18.50 Median :23.00
Mean : 9.966 Mean :20.99 Mean :22.85
3rd Qu.:12.000 3rd Qu.:27.00 3rd Qu.:28.75
Max. :18.000 Max. :59.00 Max. :51.00
#summary会给出变量的最值、第一四三四分位数、中位数和平均值
4.4 table函数
>setwd("d:/RBook")
>Deer=read.table(file="Deer.txt",header=TRUE)
错误于scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : 657行没有9元素 #读取数据过程中遇到问题出错
解决方法:
>setwd("d:/RBook") #增加fill参数,
>Deer
Farm Month Year Sex clas1_4 LCT KFI Ecervi Tb
1 AL 10 0 1 4.0 191.000 20.45000 0.00000 0
2 AL 10 0 1 4.0 180.000 16.40000 0.00000 0