R语言课程资料
第一節 R語言簡介
- R語言簡介
R 既是一種語言(R是一種解釋性語言),也是一個軟件由AT&T貝爾實驗室的S語言發展而來具有統計分析功能和強大的作圖功能開源軟件
目前在 R 網站上有 17500個程序包,涵蓋了基礎統計學、社會學、經濟學、生態學、地理學、醫學統計學、生物信息學等諸多方面.
?開源免費???提供豐富的統計分析工具??可以運行在多種平臺,Windows、Linux、Mac
?
二.Rstudio
(1)工作路徑設置
(2)歷史命令
(3)其他命令
(4)注釋顯示亂碼?File ??Reopen with Encoding...
(5)修改界面顯示字體、快捷鍵、R版本?tools
2. 包package
作用:特定的分析功能,需要用相應的程序包實現。例如:做生存分析,要用到 survival 程序包; 做meta分析,要用到 meta 包等等。
包是R函數、數據文件、幫助文檔組成的集合。相當于C語言中的庫
存儲包的目錄稱為庫(library)。
從官網下載,安裝本地包
install.packages() ???????????打開安裝包目錄
install.packages(“包名”) ???安裝一個包
library(包名) ??加載一個包
search() ???????查看已經加載的所有包
help(package=“包名”)
(1)常用包
R提供了大量功能各異的包????技術:繪圖類、統計檢驗類、機器學習?
行業:微陣數據、信用風險建模、社會科學等
注意:“*.tar.gz”是針對LINUX系統的,“*.tgz”是用于MAC OS的,只有“*.zip”才是用于WIN系統的,這一點非常關鍵。
3 . ?.Rdata和.history
?以“.”開頭的文件,通常用作配置,系統默認隱藏這類文件。
如果打開Rstudio特別慢,可能是因為.Rdata保存了很大的變量,可以找到.Rdata文件刪掉。
?
第二節 R 語言中的數據對象
一、數據對象object
1.數據對象(基本知識)
區分大小寫
不能使用關鍵字,如NA ,for 等
查詢特定格式對象ls(pat=“m”)
查詢對象及內容ls.str()
數據對象的屬性:類型,模式、長度、維度、名稱等;
數據對象(變量)的類型
| 數據對象的類型 | 含義 |
| 數值型(numeric) | 整數(integer)、單精度和雙精度(double) |
| 邏輯型(logical) | 值為TRUE或FALSE |
| 字符型(character) | 用單引號或者雙引號引用 |
| 復數型(complex) | a+bi |
| 原子型(raw) | 二進制形式保存 |
3.特殊的數據對象
| 類型 | 判別函數 | 轉換函數 |
| 數值 | is.numeric() | as.numeric() |
| 整數 | is.integer() | as.integer() |
| 雙精度 | is.double() | as.double() |
| 復數 | is.complex() | as.complex() |
| 字符 | is.character() | as.character() |
| 邏輯 | is.logical() | as.logical() |
| 無窮 | is.infinite() | - |
| 有限 | is.finite()a | - |
| 不確定 | is.nan() | - |
| 缺失 | is.na() | - |
| 空 | is.null() | as.null |
?
4.基本運算
開方sqrt(),指數exp(),對數log(),三角函數sin(),cos()
多組命令分隔符 ?;
5.R中數據對象的結構
R語言中的基本數據結構
向量
矩陣
數組
數據框
列表
R數據對象的類別:
????list(c(1,2,3,4,5),c(“A”,”B”,”C”))
R對象都有類型(mode)和長度( length )兩個基本(存儲)屬性
類型(mode)(表示對象在內存中的存儲類型)
類型:numeric(數值)、logical(邏輯)、complex(復數)、character(字符)
如:mode(rep(23,times=100))
????????mode(c(1,3,5,7)>5)
????????ch1<-rep(c("a","b","c"),times=5)
????????dim(ch1)<-c(3,5)
????????mode(ch1)
修改類型
如:mode(ch1)<-"numeric"
8.對象的屬性
對象長度賦值 ?如 :length(x)<-5
R 允許對超出長度的下標賦值,結果是?
如:x<-numeric()?????????????length(x)???????????length(x)<-5 ????????x[5]<-15
9.attributes和attr函數
x<-c(apples=2.5,orange=2.1);attributes(x)
f1<-factor(rep(c(1,2),3));attributes(f1)
exact:是否與which精確匹配,邏輯值
如:attr(x,"names")
????attr(x, "type")<-"fruit" ??#給X增加type屬性
attributes(x)
10.class屬性
如:mat<-matrix(rep(c(1,2,3,4),times=4)) ??class(f1)<-"tree"將f1定義為一種“tree”數據結構
class(mat)??????????mode(mat) ?#注意二者區別????????
class(x):
- 當x是單個值,或者向量的時候:返回的結果和mode一致,如numeric,character
- 其他情況(矩陣,數組,日期,因子)
class返回(matrix,array,Date,factor)
mode返回(x中元素的類型——在內存中的存儲類型logical(邏輯型)、numeric(數值型)、complex(復數型)、character(字符型) )
- 當x是數據框的時候,class返回dataframe,mode返回list
- 當x是列表的時候,class和mode都返回list
二、向量vector
注:單個向量中的數據類型是固定的,比如數值型向量中的元素就必須全為數值,而字符型向量中的元素必須全部為字符。
x<-c(1,2,3,4,5),其中c()為連接函數???????????????????c(1,2,3,4,5)->x
assign(“x”,c(1,2,3,4,5)) ????????????????????????????numeric(length)生成初始向量
1.有規律的向量
- 等差數列
a:b 表示從a開始,逐項加1,直到b為止。???????如 1:10表示1 2 3 4 5 6 7 8 9 10
:運算符優先級高于四則運算 ?如 ?2*1:15??????????????????如 ??1:n-1 表示??
- 等間隔函數
from,to 為數值,表示開始和結束?????by為數值,表示間隔
length.out為數值,表示數列長度??along.with為向量,表示數列長度與該向量長度相等
- 重復函數
x為數量、向量、數據對象???????????times ,x重復的次數
length.out,重復后該向量的長度??????each,x中每個分量重復的次數
正整數向量,x中分量對象重復的次數
2.邏輯向量
連接函數生成邏輯向量 z<-c(T,F,T,T) z1<-c(z,T)
邏輯運算生成邏輯向量 y<-c(5,6,7,8,9);y>5
which()判斷分量中誰為T?????logical()構造初始邏輯向量
NA表示缺失 ??z<-c(1:4,NA)
is.na(z) 檢測向量中是否有缺失值
z[is.na(z)]<-0 將缺失數據改為0
(1)分量為字符串的向量z<-c("happy","birthday")
(2)字符向量函數
character(length=5) 構造初始字符
is.character(z) 判斷是否為字符型
nchar() 提取字符向量中分量個數
6.字符向量函數
(1)substr(z,start,stop)
求子串,start,stop取整數或整數向量,分別表示取子串的起始和結束位置。
如 ?substr(“abcde”,2,4) ??bcd
????substr(rep(“abcdef”,4),1:4,4:5)
?????"abcd" "bcde" "cd" "de" ???#短向量被重復使用
(2)substr(z,start,stop)<-value
???替換子串,start,stop取整數或整數向量,分別表示替換子串的起始和結束位置,value為替換的向量
???如:x<-rep("abcdef",4)
???????substr(x,2,6)<-c("y")
???????string1<-c("生物1","生物2","生物3")
???????substr(string1,1,2)<-c("信管")
(3)paste() ?“粘貼”多個對象
???paste(……,sep=“ ”,collapse=NULL),……為一個或多個對象,sep為分隔符
???如:paste("Happy","birthday")
???????paste("Happy","birthday",sep=",")
???????paste("信管2016",1:4,sep="-")
???????paste(c("x","y"),rep(c(1,2),each=2))
(4)strsplit(x,split,fixed=FALSE)
分解字符向量,x為待分解字符向量,在split出現處分解,fixed為F時表示split精確匹配
如:strsplit("you are a good boy"," ")
(5)noquote()
去掉字符串中的引號
如:noquote("hello")
7.用vector生成向量
vector(mode="logical",length=0)
mode為生成向量的類型,默認為邏輯型??length為向量長度
如:vector(length = 3)
????vector(mode="numeric",length = 3)
8.向量的下標
X[i]
(1)其中X為向量名,i為下標,x[i]表示向量中第i個分量
(2)修改某個分量的值??????x[2]<-"aaa”
(3)向量的正下標表示被選中的分量
???x<-10:20;x[c(1,2,3,4)]
???x[c(1,2,3,1)]
???c("a","b","c","d")[rep(c(2,1,3),3)]
(5)邏輯下標
作用:選擇向量中所有邏輯下標為真的分量
如: x<-c(1,3,6);x[x>5]
????????z<-c(-1,1:3,NA);y<-z[!is.na(z)];y
(6)字符下標
給向量的分量添加名稱的2種方法
如: ages<-c(Li=33,zhang=29,Wang=31)
names()命名函數??如: fruit<-c(5,10,8,11)?;names(fruit)<-c("orange","banana","apple","peach")
(1)最小值、最大值、范圍
min(x) ?which.min(x)哪一個最小 ??
max(x) ?which.max(x)哪一個最大
range(x)
(2)求和、求乘積
?
sum(x) ?和
prod(x) 分量乘積
length(x) ?分量個數
中位數 ???median(x)
均值 ?????mean(x)
方差 ?????var(x)
標準差 ???sd(x)
向量排序 ?sort(x)
保留小數 ?round(x,digit)
隨機數 ???runif(n,min,max) ??
round(3.555,2) #保留兩位小數
runif(50,1,20) #產生50個1-20之間的隨機數
?
?
- 因子Factor
1.因子
minzu<-c("漢族","維吾爾","回族","維吾爾","漢族")
grade<-c("及格","優秀","不及格","優秀","良好")
score<-c(67,88,57,93,78)
類別:沒有順序之分的類別向量,如民族
有序:表示順序關系的向量,如等級
連續:某個范圍內的任意值,同時表示數量和順序,如分數
因子:類別和有序向量稱為因子
2.Factor函數
作用:將一個向量轉換成因子
格式
factor(x,levels,labels=levels,exclude=NA,ordered=is.ordered(x))
?
x:被轉換的向量
levels:因子水平,可以為空
labels:各水平的名字,可以為空
exclude:從x中剔除的水平值
ordered:因子水平是否有序,TRUE 或者FALSE
?
例:
data<-c(1,2,3,3,1,2,2,3,1,3,2,1) ??#數值向量
fdata<-factor(data)
grade<-c("優","良","差","差","優","良","良","差","優","差","良") ??#字符向量
fgrade<-factor(grade)
3.gl函數
生成因子
(1)gl(n,k,length=n*k,labels=1:n,ordered=FALSE)
?
n: 水平個數,整數
k: 重復次數,整數
length:因子向量的長度
labels:因子的水平名稱
ordered:是否有序
?
(2)levels()
查看因子的水平 ???levels(fdata) ?
例:gl(3,5) ?#3個水平,每個水平重復5次
gl(3,5,labels=c("A1","A2","A3")) ?#帶名稱的因子
gl(3,5,labels=paste("A",1:3,sep="")) ??#因子的名稱用paste函數生成
4.與因子有關的函數
(1)table函數
統計因子向量中各水平出現的頻數 ????table(fdata)
(2)tapply函數
不同水平下指定函數的計算
tapply(x,index,fun,simplify=TRUE)
?
x:計算對象,向量 ????index:與x長度相同,表示x的因子水平
fun:需要計算的函數 ??simplify:返回值類型,T表示數組,F為列表
?
- 矩陣
1.矩陣的生成
(1)matrix(data, nrow, ncol, byrow, dimnames)
?
data:數據向量
nrow:矩陣的行數
ncol: ?矩陣的列數
byrow:邏輯值,T表示行序為主序,F表示列序為主
dimnames:行、列名稱,列表格式
?
如:
mdat<-matrix(c(1,2,3,4,5,6,7,8,9,0),nrow=2,byrow=T,dimnames=list(c("row1","row2"),c(“C1”,”C2”,”C3”,”C4”,”C5”)))
(2)dim函數
設置或求矩陣的維數
如:dim(mdat)
???x<-1:12 ?; ???dim(x)<-c(3,4)將向量X以列序為主序設置為矩陣
2.與矩陣運算有關的函數
?
(1)求矩陣的維數
dim() ????求矩陣的行列數
nrow() ??求矩陣的行數
ncol() ????求矩陣的列數
?
(2)矩陣的合并
rbind() ??對矩陣按行合并,要求子矩陣有相同列數
如: x1<-c(1,2,3,4,5,6)
????????x2<-c("a","b","c","d","e","f")
????????dim(x1)<-c(2,3)
????????dim(x2)<-c(2,3)
????????rbind(x1,x2)
cbind() ?對矩陣按列合并,要求子矩陣有相同行數
(3)矩陣的拉直
as.vector() 將矩陣轉換為向量
如:as.vector(mat)
(4)矩陣行列的命名
rownames() ?求矩陣行名,或為其命名
colnames() ???求矩陣列名,或為其命名
如:mdat<-matrix(c(1,2,3,4,5,6,7,8,9,0),nrow=2,byrow=T)
rownames(mdat)<-c("row1","row2")
colnames(mdat)<-paste("C",1:5,sep="")
3.矩陣下標
使用矩陣下標訪問矩陣元素,如同C語言中的二維數組,下標從1開始
如:A[1,2] 表示行下標為1,列下標為2的矩陣元素值
A[1,] 表示行下標為1的整行元素
A[,-2] ??表示矩陣去掉列下標為2的元素剩下的元素
4.數組的生成(2種方法)
(1)array(data=NA,dim=length(data),dimnames=NULL)
?
data:數據向量
dim:數組各維長度,整數向量,默認為data長度
dimnames:各維的名稱,列表的形式
?
如:data<-rep(c(1,3,5,7),times=5) ????x<-array(data,dim=c(5,4))
????x1<-array(data,dim=c(2,5,2))
(2)dim()構造數組
x2<-1:24
dim(x2)<-c(3,4,2)
dimnames對各維命名
dimnames(x2)<-list(c("row1","row2","row3"),c("col1","col2","col3","col4"),c("z1","z2"))
5.數組下標
使用下標對數組元素訪問
?
a<-1:20
dim(a)<-c(4,5)
a[1,3];a[1,];a[1,2:3]
?
6.apply函數
對矩陣或數組按照維度做運算
apply(x,margin,fun)
?
x:數組或矩陣
margin:做運算的維度,1表示行,2表示列
fun:運算函數
?
如:A<-matrix(1:6,nrow=2);A?????????sum(A);sum(A[,2])?????????apply(A,1,sum)
?
- 列表list
列表的元素類型可以是任意對象,可以是不同類型。
1.列表的構造
list(成員列表)
如:st<-list(name="Fred",wife="Mary",no.children=3,child.age=c(2,4,7))
stu<-list(name="張三",class1=c("高數","計算機","體育","英語"),intrests=c("繪畫","唱歌"))
2.列表成員的訪問
列表名[[下標]] ?????如:lst[[1]];stu[[2]];stu[[2]][2]
每次只能訪問一個成員,不能同時訪問多個
列表名[下標]表示一個子列表 ???如:lst[1]
列表名[[“成員名”]] ??????????如:lst[[“name”]]等價 lst[[1]]
列表名$成員名 ???????????????如: lst$name等價 lst[[1]]
六、數據框data.frame
矩陣形式,各列類型不同。列為變量,行為一個觀測樣本。
1.數據框的生成
(1)data.frame函數
df<-data.frame(
????????????????Name=c("Alice","Becka","James","Jeffrey"),
????????????????Sex=c("F","F","M","M"),
????????????????Age=c(13,13,12,13),
????????????????Height=c(56.5,65.3,57.3,62.5),
????????????????Weight=c(84,98,83,84))
(2)as.data.frame將其他數據結構轉換成數據框
lst<-as.data.frame(lst)
2.數據框的引用
數據框元素的引用與矩陣元素的引用方法相同
使用下標???????????????????df[1:2,3:4] ;df[,1] #使用下標
使用變量名稱???????????????df[[“Name”]];df[,“Name”];df[“Name”];df$Name
3.數據框的命名
將名稱向量賦予列或行
變量(列)命名 ?????names(df)<-paste("col",1:5,sep = "")
行命名 ?????rownames(df)<-c("row1","row2","row3","row4")
rownames(df)<-df[,1] ??
3.attach函數
將數據框“連接”到內存中,便于調用 ??attach(df)
r<-Height/Weight
給數據框增加新的變量 ???數據框名$新變量<-值 ?如:df$r<-Height/Weight
刪除變量:數據框名$新變量<-NULL
取消“連接” ??detach(df)
4.lapply()函數與sapply()函數
?
(1)lapply()
lapply(x,fun)
lapply(lst[3:5],mean); lapply(lst["Age"],mean)
lapply(df[,3:5],mean)
?
(2)sapply()
sapply(x,fun)
sapply(lst[3:5],mean); sapply(lst["Age"],mean)
sapply(df[,3:5],mean)
?
5.apply,sapply,lapply,tapply,vapply, mapply
apply : 用于遍歷數組中的行或列,并且使用指定函數來對其元素進行處理;
lapply : 遍歷列表向量內的每個元素,并且使用指定函數來對其元素進行處理。返回列表向量;
sapply : 與lapply基本相同,只是對返回結果進行了簡化,返回的是普通的向量;
mapply: 支持傳入兩個以上的列表;
tapply: 接入參數INDEX,對數據分組進行運算,就和SQL中的by group一樣。
?
第三節程序控制結構
一、分支函數
1.if / else函數??多用于兩分支
格式1:if (cond) expr
??????????????如果cond條件成立,則執行expr,否則跳過
格式2:if (cond) cons.expr ?else ?alt.expr
??????????????如果cond條件成立,則執行expr,否則執行alt.expr
2.if / else函數的嵌套
if (cond) expr
else if (cond_1) ?expr1
else if (cond_2) expr2
else expr3 ?????????
3.R語言中的if-else語句寫法
結構 ?1 : ?if() ?xx ?else ???yy ???一行;
結構 ?2: ??if() ?{xx} else ?{yy} ?????????????????
或者 ??if(){ ?
??????????????? xx ?????????????????????????
}else ???#此處不能兩行寫 ????????????????????????
yy
結構3: ?{
if ???
else ?
}
結構3,括號可以任意寫。
4.switch函數
用于多分支
格式:switch(expr,list)
?????????expr表達式,List列表
表明:如果表達式的值在length(list)之間,則返回列表中對應表達式位置上的值。
如:switch(1,"a","b","c")
如果list有元素名,expr等于元素名時,返回變量名對應的值
y<-"fruit" ?
switch(y,fruit="banana",vegetable="broccoli",meat="beef")
二、循環函數
1.for函數
格式:for(var in seq) expr
?var:循環變量 ?????????seq:向量表達式,如1:20 ???????expr:一組表達式
2.while函數
格式:while (cond) expr
例如:編寫計算1000以內的Fibonacci數
????????f(i)=f(i-1)+f(i-2)
f<-c(1,1);i<-1
while(f[i]+f[i+1] < 1000){
??f[i+2]<-f[i]+f[i+1]
??i<-i+1
}
3.repeat函數
格式:repeat ?expr
???結合break語句跳出循環
例:i<-10
repeat{
??print("hello") ;i<-i-1
????if (i<0) break
}
4.中止語句與空語句
中止語句break ??強行中止,跳出循環
三、R程序設計
1.函數定義
格式:funname<-function(arg_1,arg_1,……)expression
?
funname:函數名
arg_1,arg_2:函數參數
?expression:表達式
?
2.函數調用
格式:funname(expr_1,expr_2)
注意:在編輯器中編寫和保存使用時,需要調用函數所在的腳本文件 ???
????????source(“funname.R”)
????????funname()
3.無參數函數
??執行時不需要輸入參數,每次執行,返回值都相同。
例如:welcome<-function()
????????print(“welcome to use R”)
調用:source(“welcome.R”)
???????welcome()
4.有參數的函數
函數名<-function(){
……
返回值計算表達式
}
5.有名參數
函數調用時,如果參數沒有名稱,需要按照定義順序設置參數;
函數調用時,可以指定形參和實參的對應關系,此時順序可以不按照定義時;
如 fun1<-function(data,data.frame,graph,limit)
??調用 ans<-fun1(d,df,TRUE,20)
????????ans<-fun1(d,df,graph=TRUE,limit=20)
????????ans<-fun1(data=d,limit=20,graph=TRUE,data.frame=df)
6.遞歸函數
(1)遞歸函數:自身調用自身,在函數體內增加一個計算結果的變量
如:向量的求和公式編寫
例:求n的階乘
(2)類似函數不用編寫,R自帶很多相應函數
Browser()調試提示符窗口上方的導航按鈕實現下一步操作:
第一個按鈕是Next(下一步) 用來運行函數的下一行代碼;
第二個按鈕是Continue(繼續) 用來運行函數剩余的所有代碼,完成之后退出瀏覽器模式;
第三個按鈕是Stop(停止) 他會立刻中斷并退出瀏覽器模式,不運行任何代碼;
7.作用域
全局變量
x<-10;y<-20 ?????????#x,y全局變量
f<-function(y) ?x+y ??#y為局部變量 ????????f(10)
8.程序調試
(1)print()顯示變量內容的函數
使用print()函數顯示變量的值
如:f<-function(y){
???????????print(x);print(y);x+y
????????}
??????f(y)
??????f(10)
(2)cat()函數
f<-function(y){
??cat('x=',x,'\n');cat('y=',y,'\n');x+y
}
(3)跟蹤程序的函數
browser():在程序體內增加該語句,單步調試;
debug():函數運行前增加debug(函數名),標記函數進行測試;
外部文件的讀寫
?第四節 外部文件的讀寫
一、外部文件的讀寫
二、純文本文件
1.read.table()函數?????讀取表格形式的文件read.table(file,header=True,sep=“”,row.names,col.names,skip,nrows)
?
file:讀入數據文件名,數據以表格形式(純文本文件)保存在文件中。
header:數據文件中有表頭,則為T。
sep:數據分隔字符
row.names:行名
col.names:列名(變量名)
skip:讀數據時跳過的行數,非負整數。
nrows:讀取的行數
?
例:體會以下代碼的含義
data_stu<-read.table("stu.txt",header=T)
data_stu
data_stu<-read.table("stu.txt",header=T,row.names = paste("201601",1:5,sep=""))
data_stu<-read.table("stu.txt",header=F,skip=2)
2) scan()函數
直接讀純文本文件
?
file:讀取的文件名
sep:為分隔符
?
例:data_stu1<-scan(file="data.txt")
2.read.fwf()
將固定寬度格式的文本文件讀入R
read.fwf(file,widths,header,sep,skip,row.names,n)
?
file:讀入文件名
widths:整數向量,每個值表示讀入變量的?????????????寬度
header:是否有變量名
sep:分隔變量名的符號
skip:文件頭部跳過的行數
row.names:行名的向量
n:讀入R的行數
?
三、Excel文件
1.read.delim()函數
需要將Excel文件轉換為文本文件(制表符分隔)后讀取
read.delim(file,header)
file :文件名 ?????header:是否有表頭,值為True或者False
2.read.csv()函數
需要將Excel文件轉換成CSV(逗號分隔)文件
read.csv(file,header)
3.直接讀取Excel數據表
例
install.packages(“RODBC”)
library(RODBC)
con<-odbcConnectExcel(“scores.xls”)
tbles<-sqlTables(con)
sh1<-sqlFetch(con,tbls$TABLE_NAME[1])
qry<-paste(“select * from [“,tbls$TABLE_NAME[1],”]”,sep=“”)
shc<-sqlQuery(con,qry)
close(con)
四、其他軟件格式數據文件
可以讀取SPSS\SAS\S-PLUS和Stata數據文件
1)必須先加載foreign數據包 ????2)read.spss(file)
注:對于大型數據的讀取可以使用readr包和readxl包,速度比read.table()快很多。
五、數據集的讀取
1.R提供了100多個數據集
2.使用data()函數查看或加載數據集
六、寫數據文件
1.write()函數
write(x,file,ncolumns,append)
x:需要寫入文件的數據,通常為矩陣或向量
file:要保存的文件名
ncolumns:列數,字符默認1,數值默認5
append:邏輯變量,為T表示在原有文件添加數據,F表示新文件
2.write.table()與write.csv()
將數據寫為表格形式的文本文件或者CSV格式文件
write.table(x,file,append,sep)
sep:為分離數據的字符
總結
- 上一篇: 大一计算机网络技术实训总结,大一计算机网
- 下一篇: HBuilder / HBuilder