《R语言初学者指南》—简单函数、自定义函数、循环
一、简单函数
table(A):数据透视,A为向量,同类计数
table(A,B):数据透视,A,二维计数
apply(data,1/2,function):data为矩阵或数据框,1为按行拆分计算,2为按列拆分计算。输出结果跟函数有关,如函数每次返回一个值,则最终apply返回向量;如函数每次返回一个向量,则最终apply返回矩阵。
tapply(X=A,Index=B,Fun=C):
数据透视,以B为纲对A进行各种计算。A、B为向量,C为计算方法如length、mean、sum。
sapply(X,function):apply(,2,),X必须为数据框
lapply(X,function):应用于list
summary():对象可以是向量、矩阵、数据框,返回每列最小值、第一四分位数、中位数、平均值、第三四分位数、最大值。
colsums(,na.rm=T),rowsums()
Veg
tapply(Veg$R,Veg$Transect,mean)
## 1 2 3 4 5 6 7
## 7.571429 6.142857 10.375000 9.250000 12.375000 11.500000 10.500000
## 8
## 11.833333
二、循环
先写一个元素的实现代码,再替换通用部分
案例:针对每个鸟巢(27个鸟巢)绘制一个通同胞协商对到达时间的jpeg格式的散点图。
1.载入数据
setwd("C:\\Rstudio\\RBook")
Owl
str(Owl)
## 'data.frame': 599 obs. of 7 variables:
## $ Nest : Factor w/ 27 levels "AutavauxTV","Bochet",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ FoodTreatment : Factor w/ 2 levels "Deprived","Satiated": 1 2 1 1 1 1 1 2 1 2 ...
## $ SexParent : Factor w/ 2 levels "Female","Male": 2 2 2 2 2 2 2 1 2 1 ...
## $ ArrivalTime : num 22.2 22.4 22.5 22.6 22.6 ...
## $ SiblingNegotiation: int 4 0 2 2 2 2 18 4 18 0 ...
## $ BroodSize : int 5 5 5 5 5 5 5 5 5 5 ...
## $ NegPerChick : num 0.8 0 0.4 0.4 0.4 0.4 3.6 0.8 3.6 0 ...
2.提取一个鸟巢数据实现
unique(Owl$Nest)
## [1] AutavauxTV Bochet Champmartin ChEsard
## [5] Chevroux CorcellesFavres Etrabloz Forel
## [9] Franex GDLV Gletterens Henniez
## [13] Jeuss LesPlanches Lucens Lully
## [17] Marnand Moutet Murist Oleyes
## [21] Payerne Rueyes Seiry SEvaz
## [25] StAubin Trey Yvonnand
## 27 Levels: AutavauxTV Bochet Champmartin ChEsard ... Yvonnand
OwlAut
jpeg("C:/Rstudio/RBook/Pic/AutavauxTV.jpg")
plot(x=OwlAut$ArrivalTime,y=OwlAut$NegPerChick,xlab="Arrival Time",ylab="Negotiation behavior",main="AutavauxTV")
dev.off()
## png
## 2
3.设计通用代码
AllNest
for(i in 1:length(AllNest)){
NestName
path
NestData
jpeg(path)
plot(x=NestData$ArrivalTime,y=NestData$NegPerChick,xlab="Arrival Time",ylab="Negotiation behavior",main=NestName)
dev.off()
print(i)
}
三、自定义函数
分为一个数据参数,多个数据参数(位置匹配),以函数为参数(分功能实现代码,再用if合并)等等。
案例1:函数输入数据框,计算每个变量含有缺失值的个数。
NaPerVarible
D1
colSums(D1)
}
案例2:函数确定每个变量中有多少个0
ZeroPerVarible
D1
colSums(D1,na.rm=T)
}
案例3:具有多个参数的函数
VaribleInfo
if(Choice1=="Zeros"){D1
if(Choice1=="Na"){D1
if(Choice1!="Zeros"& Choice1!="Na"){
print("Type 'Zeros' or 'Na'")
}else{colsums(D1, na.rm=T)}
}