R語言 1997年成為GNU項目 開源免費
R官方網址 www.r-project.org
R是數據分析領域的語言
小巧靈活,通過擴展包來增強功能
繪圖功能
代碼簡單
開發環境
R + RStudio
1、數據類型
character 字符
numeric 數值型,實數或小數
integer 整型
complex 復數型
logical 邏輯型 類似於boollean
2、數據結構
Vector 向量
Factor 因子
Array 數組
Matrix 矩陣
Data Frame 數據框
List 列表
一維:向量、因子 向量屬於數值型變量,因子對應於分類變量
二維:矩陣、數據框 矩陣中元素的數據類型是一致的,數據框由向量組成,每個向量中的數據類型保持一致,向量間的數據類型可以不一致,類似於表結構。
三維:數組、列表 數組用的比較少,多維數據結構;列表可以包含上面所有的數據結構
3、向量
向量表示一組數據,數據類型一致,向量可以表示行或者列
c() 如:
: 如: 1:10
seq(from(開始), to(到), by(步長), length.out(指定向量的元素個數), along.with(長度與指定的向量長度相同))
提取子集:
數字下標(正數:獲取指定元素,從1開始,負數:排除的意思)
which()函數(按條件來進行篩選)
#向量
(x1<- c(10,11,12,13))
(x2<- 1:10)
x3<- seq(1,5,1) #from 1 to 5 by 1
x4<- seq(5,by=2,length.out=8) #向量中元素個數為8
x5<- seq(2,by=3, along.with = x4) # along.with向量個數與x4一致
x5[1:5]
x5[c(1,2,3,4,5)]
x5[-1:-5] #不要下標為1-5的元素
which(x5>5) #大於5的向量下標
x5[which(x5>10)] #大於5的向量值
4、因子
因子用於分類變量,有類別
factor()
gl()
#因子
f<-c('a','a','b','o','ab','ab')
f<-factor(c('a','a','b','o','ab','ab')) #創建因子,level默認按字母排序
unclass(f) #查看因子
f<-factor(c('a','a','b','o','ab','ab'),levels = c('a','b','o','ab')) #指定因子對應的level
unclass(f) #
f1<- gl(4,3,labels = c('blue','red','green','yellow')) #4個級別,每個級別重復3次,labels的內容
f1
unclass(f1)
5、矩陣
行和列
生成矩陣
matrix()
由向量派生
由向量組合生成
操作
訪問元素
行列命名
矩陣運算
矩陣加法
1.矩陣+n 各個元素加n
2.矩陣+矩陣 對應元素相加
矩陣乘法
1.矩陣*n 各個元素乘n
2.矩陣*矩陣 行列相乘(矩陣1 m行*n列 矩陣2 p*q 要求n==p 結果矩陣為 m*q)
3.矩陣元素*矩陣元素 對應元素相乘
單位矩陣
元素都為1 n*n方陣
對角矩陣
對角元素為1 其余的為0 n*n方陣
矩陣轉置
n*m m*n
#矩陣
#創建矩陣:
#方法一:使用matric(nrow=?,ncol=?)
x<-matrix(nrow=2,ncol=3) #nrow 指定行, ncol指定列
x
x<-matrix(1:18,nrow = 3,ncol = 6) # 3行,6列,元素值由1:18填充,默認一列一列順序填充
x
x<-matrix(1:18,nrow = 3, ncol = 6, byrow = T) # 3行,6列,元素值由1:18填充,指定行順序填充
x
#方法二: dim(a) 通過dim 傳遞向量
a<-1:18
dim(a)<-c(3,6) #3行6列,行順序填充
x
#方法三: rbind或cbind進行拼接
x<-1:10
y<-11:20
z<-21:30
m1 = rbind(x,y,z) #以行為單位進行拼接
m2 = cbind(x,y,z) #以列為單位進行拼接
m1
m2
#獲取矩陣元素
x<-matrix(1:18,nrow = 3,ncol = 6,byrow = T)
x
x[1,2] #第1行第2列
x[1,] #第1行
x[,2] #第2列
x[,c(2,3,4)] #第2 3 4列
x[c(1,2),] #第1 2行
x[c(1,2),2:4] #第1 2行 第2 3 4列
#行列命名
colnames(x)<-c('C1','C2','C3','C4','C5','C6') #列的名字
rownames(x)<-c('R1','R2','R3') #行的名字
x['R1','C1']
x[c('R1','R2'),c('C1','C2')]
#矩陣運算
m1<-matrix(1:18,nrow = 3,ncol = 6, byrow = T)
m2<-matrix(19:36,nrow = 3, ncol = 6, byrow = T)
m1
m2
#矩陣加法
m1+10 #矩陣+n
m1+m2 #矩陣+矩陣
#矩陣乘法
m1*10 #矩陣*n
m1*m2 #矩陣對應元素相乘
m1 %*% t(m2) #矩陣*矩陣 矩陣乘法 行列相乘
#對角矩陣
diag(4) #4*4矩陣 對角元素都為1
diag(c(1,2,3,6)) #4*4矩陣,對角元素為1,2,3,6
x<-matrix(1:16,4,4)
diag(x) #顯示矩陣x的對角元素值
#解方程組
m<-diag(4)
m
b<-1:4
solve(m,b) #m %*% x=b 求x
6、數據框
記錄與域
#數據框
#創建數據框
a<-data.frame(fx = rnorm(10,10,2),
fy = runif(10,10,20),
fmonth = 1:10 )
a[1,1]
a[1,]
a[,2]
a$fx #通過$fx取列信息
a[[1]]#通過[[]]獲取列信息
search() #查詢
attach(a) #attach 數據到 search路徑
fx #直接使用
detach(a) #detach 數據
search() #查詢
a<-with(a, fx) #訪問數據框成員
#新增修改列
a<-within(a,{fx=1:10 #通過within來進行修改,和新增列
fz=11:20})
#新增列
a$fz = 11:20
a$fz = a$fx+a$fy
#列存在則修改
a$fx = 1:10
#查詢數據集
b = subset(a,fx>1&fmonth==8,select=c(fx,fmonth)) #select 列過濾,fx>1&fmonth==8 行過濾
b=edit(a) #修改後的數據集賦值給另一個數據集
b
fix(a) #直接修改數據集內容
a
7、列表
成分
創建列表
list()
操作
列表成分
[[]]
$
#列表
#創建列表
a<-list(x=1:10,y=matrix(1:16,4,4),z=data.frame())
names(a) <- c('c1','c2','c3') #修改成分名稱
c
c=a['y'] #在列表中通過[]取出的對象類型還是列表
c[2,1]
class(c) #查看類型為list
c=a[['y']] #在列表中通過[[]]取出的對象類型為實際對象類型矩陣
c[2,1]
class(c) #查看類型為matrix
a$y[2,1] #獲取矩陣的元素
8、數組
array
#數組
(a=array(1:60,c(3,4,5))) #數組三維
a[1,2,3]
9、數據類型轉換
檢查數據類型 is.開頭
is.character
轉換數據類型 as.開頭
as.character
x=c(1:2,'hello',T)
x
mode(x) #查看數據類型
class(x) #查看數據結構
is.vector(x)
y<-matrix(1:20,c(4,5))
mode(y) #數據類型是numeric
class(y) #數據結構是matrix
y<-as.data.frame(y) #數據類型轉換matrix->dataframe
y
10、分之結構
if...else...結構
if(condition){...}
else{...}
ifelse函數
#分支結構
(Brand<-paste(c('Brand'),1:9,sep='')) #粘合一起
#"Brand1" "Brand2" "Brand3" "Brand4" "Brand5" "Brand6" "Brand7" "Brand8" "Brand9"
(PName<-paste(c('Dell'),1:9,sep=' '))
(Mem<-rep(c('1G','2G','4G'),times=3)) #重復
#"1G" "2G" "4G" "1G" "2G" "4G" "1G" "2G" "4G"
(Feq=rep(c('2.2G','2.8G','3.3G'),each=3))
(Price=rep(c(1000,2000,5000),3))
PC=data.frame(Brand,PName,Mem,Feq,Price)
##分支結構
#if..else
PC
PC$PD=rep('Cheap',9)
for (i in 1:nrow(PC)){ #1:nrow(PC)從第1行到最後一行
if (PC[i,'Price']>3000){ #取值進行比較
PC[i,'PD']='Expensive' #修改值
}
}
PC
#ifelse函數
PC$PD2=ifelse(PC$Price>3000,'Expensive','Cheap') #向量化運算
PC
c
11、循環結構
for(n in x){...}
while(condition){...}
repeat{...break}
break next
#循環結構
for (x in 1:5){
print (x^2)
}
i=1
while (i<6){
print (i^2)
i=i+1
}
i=1
repeat {
print (i^2)
i=i+1
if (i>5) break
}
12、函數
自定義函數
myfunc =function(par1,par2,...){
...
}
引用函數文件
source('D:/basic.R', encoding = 'UTF-8')
查看源碼
myfunc #終端顯示
page(myfunc) #用第三方編輯器查看
#函數
myadd=function(a,b,c){
return (a+b+c)
}
mystat=function(x,na.omit=FALSE){
if (na.omit){
x=x[!is.na(x)]
}
m=mean(x)
n=length(x)
s=sd(x)
skew=sum((x-m)^3/s^3)/n
return (list(n=n,mean=m,stdev=s,skew=skew))
}
13、向量化運算和apply家族
#向量化
x=1:5
(y=x^2)
(y=matrix(1:16,4,4))
(z=y^2)
(x=1:5)
(y=11:15)
(x+y)
y>=13
ifelse(x%%2==0,'A','B')
x=data.frame(pv=rnorm(100,20,3),
uv=rnorm(100,40,4),
ip=runif(100,40,50))
apply(x,MARGIN = 2,mean)
apply(x,MARGIN = 2,quantile,probs=c(0.1,0.5,0.9))