R基礎入門教程

由於一個項目原因,需要用到R對數據進行迴歸分析和數據挖掘,因此花半天時間對R進行了一個基礎的學習。這是之前整理的網易雲課程上的一個視頻教程中整理的。

這裏貼出來,也提供給源代碼下載地址(http://pan.baidu.com/s/1c1mV0Xy),方便大家直接在RStudio中執行測試,也方便自己和大家在學習過程中對基本的指令的查詢。

我剛發現,有可能第一次打開會出現亂碼。這時候在RStudio中選擇tools->global options->code->saving裏面將text encoding設置爲UTF-8就好啦~

安裝RStudio之前必須先安裝R,安裝包下載地址給分享給大家。

R安裝包:http://pan.baidu.com/s/1bnYK2g3

RStudio安裝包:http://pan.baidu.com/s/1nu0kvVj

照着敲一遍,包你入門啦~不要偷懶!!不想往下看的話,就去下載上面給出鏈接的源代碼tutorial.R文件哦。


#########################R learning##############
###1.R introduction ####
#語言歷史和特點

#1.1 R語言歷史####
#R是S語言的一種實現。S語言是由AT&T貝爾實驗室開發的一種用來進行數據探索、
#統計分析、作圖的解釋型語言。最初S語言的實現版本主要是S-PLUS.
#S-PLUS是一個商業軟件,它基於S語言,並由MathSoft公司的統計科學部進一步完善。
#後來Auckland大學的Robert Gentleman和Ross Ihaka及其他志願人員開發了一個R系統
#R的使用與S-PLUS有很多類似之處,兩個軟件有一定的兼容性

#1.2 R的特點####
#1.有效地數據處理和保存機制
#2.擁有一整套數組和矩陣的操作運算符
#3.一系列連貫而又完整的數據分析中間工具
#4.圖形統計可以對數據直接進行分析和顯示,可用於多種圖形設備。
#5.一種相當完善、簡潔和高效的程序設計語言。包括條件語句、循環語句、用戶自定義的遞歸函數以及輸入輸出接口。
#6.R語言是徹底面向對象的統計編程語言
#7.R語言和其他編程語言、數據庫之間有很好的接口
#8.R語言是自由軟件,可以放心大膽地使用,但其功能卻不必任何其他同類軟件差
#9.R語言具有豐富的網上資源

###2. Rstudio和R的基本操作####

#2.1查看R語言自帶的數據集
data()

#直接輸入數據集的名稱,查看數據
CO2

#2.2快捷鍵
#Ctrl+Enter:
#Ctrl+L:
#Ctrl+Shift+S:
#Ctrl+1:
#Ctrl+2:
#Ctrl+D:

#2.3查看數據集的前6行####
head(CO2)
#查看數據集的最後6行
tail(CO2)

#2.4安裝包(可以通過命令或者圖形界面來咱安裝)####
installed.packages("ggplot2")

#加載包
library(ggplot2)

#2.5創建向量和矩陣以及對它們的基本操作####
x1 <- c(1,2,3,4,5,6)
x2 <- c(2,4,6,8,10,12)

length(x1)

mode(x1)

class(x1)

rbind(x1,x2)     #行聯合

cbind(x1, x2)    #列聯合

Dmat<-cbind(x1,x2)
class(Dmat)   #使用c函數結合的變量組成的是矩陣

Dmat<-rbind(x1,x2)
class(Dmat)

Dframe<-as.data.frame(cbind(x1,x2))
class(Dframe)

Dmat;Dframe  #矩陣和數據框格式是不一樣的,矩陣是由行列組成的,數據框是由記錄和變量組成的

a<-c(1:100)
length(a)
cbind(a)
a

#2.6常用的函數####
b<-c(1:20)

mean(b)   #均值

sum(b)    #求和

max(b)    #求最大值

min(b)   #求最小值

sd(b)    #標準差

#2.7產生向量####
1:5

1:5*2

1:5*2+1

#2.8查看內存中已有的對象####
ls()

#刪除當前內存中的所有對象
rm(list=ls())
ls()

#2.9訪問向量中的元素####
a<-1:5*2-1
a
a[3]
a[-3]
a[2:4]
a[-(2:4)]
a[1,2,3]   #不能這樣訪問向量中的元素
a[c(1,2,3)]
a[a<=5]
a[a<=3 | a >= 7]
a[a>=3 & a <= 7]
a[a[2]]

#2.10 seq()函數和rep()函數,用來產生等差數列的函數,調用實例函數####
example("seq")
seq(0, 1, length.out = 11)

seq(stats::rnorm(20)) # effectively 'along'

seq(1, 9, by = 2)     # matches 'end'

seq(1, 9, by = pi)    # stays below 'end'

seq(1, 6, by = 3)

seq(1.575, 5.125, by = 0.05)

seq(17) # same as 1:17, or even better seq_len(17)

example(rep)
rep(1:4, 2)

rep(1:4, each = 2)       # not the same.

rep(1:4, c(2,2,2,2))     # same as second.

rep(1:4, c(2,1,2,1))

rep(1:4, each = 2, len = 4)    # first 4 only.

rep(1:4, each = 2, len = 10)   # 8 integers plus two recycled 1's.

rep(1:4, each = 2, times = 3)  # length 24, 3 complete replications

rep(1, 40*(1-.8)) # length 7 on most platforms

rep(1, 40*(1-.8)+1e-7) # better

## replicate a list
fred <- list(happy = 1:10, name = "squash")
rep(fred, 5)

# date-time objects
x <- .leap.seconds[1:3]
rep(x, 2)

rep(as.POSIXlt(x), rep(2, 3))

## named factor
x <- factor(LETTERS[1:4]); names(x) <- letters[1:4]

rep(x, 2)

rep(x, each = 2)

rep.int(x, 2)  # no names

rep> rep_len(x, 10)


#2.11 產生字母序列####
letters[1:30]

#2.12 which()函數####
a<-rnorm(10)
a
which.max(a)  #返回數組中最大的數的位置
which.min(a)   #返回數組中最小的數的位置
a[which.max(a)]
which(a==a[which.max(a)])
which(a>0)
a[which(a>0)]

#2.13排序函數####
a<-1:10
a
rev(a)   #反轉順序

a<-c(3,1,5,6,9,2,7,4,6,5)
sort(a)
rev(sort(a))

#2.14生成矩陣####
a<-c(1:36)
a
a1<-matrix(a,nrow = 9, ncol = 4);a1
a2<-matrix(a,nrow = 4, ncol = 9);a2
a3<-matrix(a,nrow = 9, ncol = 4, byrow = TRUE);a3
dim(a1)   #查看函數的維度
dim(a2)[1]   #行
dim(a3)[2]   #列

#矩陣運算
t(a1)    #轉置
a1+a2
a1+a3

#2.15改變RStudio的工作界面(通過tools裏面的layout設置完成)####

#2.16 設定工作目錄,方便載入數據,將數據存放在設定的目錄中,載入數據時就不用指定路徑了####
setwd("F:/feiguR/data")
setwd("F:\\feiguR\\data")


getwd()  #用於查看當前工作目錄

#2.17 help()函數####
help("seq")
?seq
help(package="ggplot2")

#2.18 example()函數####
example("seq")
example("hist")
example("plot")

#搜索自己需要的函數
help.search("multivariate normal")

#2.19 數據框 dataframe####
##數據框就是一個數據表格,一行表示一個記錄,一列表示一個變量
x1<-c(1,2,3,4,5,6,7,8,9)
x2<-c(2,4,6,8,10,12,14,16,18)
x<-data.frame(x1,x2);x
x=data.frame('weight'=x1, 'cost'=x2);x
x$"feerate"<-x$cost/x$weight    #數據框可以利用已有的變量產生新的變量並存儲於當前數據框中
names(x)   #查看數據框中的變量
str(x)    #查看數據框中數據的定義
#我們在載入數據後,要使用上面的兩個函數來檢查數據載入是否成功,並檢查數據的定義

#2.20 列表list() ####
x1<-1  #單個數字,其實是一個只有一個元素的一維向量

x2<-c(1,2,3,4)

x3<-c("a","bc","d")    #字符向量

x4<-matrix(1:36,nrow = 9,ncol = 4)    #矩陣,vector

x5<-data.frame(a=c(1,2,3,4), b=c(2,3,4,5),c=c(3,4,5,6))

list_01<-list(x1=x1,x2=x2,x3=x3,x4=x4,x5=x5)     #產生一個數據框

list_01$x3


###3. 數據導入與導出 ####

#3.1 先把R內置的CO2數據集導出,然後再聯繫導入操作####
write.table(CO2,file="二氧化碳.txt")
write.csv(CO2,file = "二氧化碳.csv")

#3.2 導入逗號分割的文本文件####
read.table(file = "二氧化碳.txt", header = TRUE)
#最好指定一個名稱
carbon<-read.table(file = "二氧化碳.txt", header = TRUE)

#3.3 導入csv格式的數據####
carbon_csv<-read.csv(file = "二氧化碳.csv", header = TRUE)

#3.4通過剪貼板讀入數據並寫入文件
setwd("F:/feiguR")
clipboard<-read.table("clipboard",header = TRUE)
clipboard

write.table(clipboard, file = "clipboard.txt")

#3.5 導入空格分割的文本文件數據####
setwd("F:/feiguR")
lowtem<-read.table(file = "lowtemperature.prn", header = TRUE)
names(lowtem);str(lowtem)

lowtem$fyear<-factor(lowtem$year, c(2013,2014,2015), labels = c("2013年","2014年","2015年"))
#此處設計重新編碼變量的操作

#3.5.1 讀取數據框中的變量####
#1)很多函數中有data參數,可以指定數據框,然後在函數內部直接訪問數據框中的變量
boxplot(lowtem~year, data = lowtem)

#2)使用美元符號$
boxplot(lowtem$lowtem~lowtem$year)

#3)使用attach函數,不推薦使用,很容易出錯,特別是在同一個R代碼及中寫很多不同程序的時候
attach(lowtem)
boxplot(lowtem~year)
detach(lowtem)

###3.6 數據子集操作####
#1)先明確分類變量有幾個類別
unique(lowtem$year)
#2)選擇數據子集
lowtem_15<-lowtem[lowtem$year=2015,]
plot.ts(lowtem_15$lowtem)
#3)多個條件用邏輯連接符號進行連接
lowtem_1501<-lowtem[lowtem$year==2015 & lowtem$day=="1/1",]
lowtem_1501
#4)排序操作
#按照日最低氣溫進行排序,這個排序可能沒有實際意義,這裏只是演示操作的方便
orderlowtem<-lowtem[order(lowtem$lowtem),]    #對行的操作
View(orderlowtem)

#5)合併數據子集
#加入三年的氣溫數據是分開的,我們要將它們合併到一個數據集中
#(1)先讀入數據
setwd("F:/feiguR")
hightem<-read.table("clipboard",header = TRUE)  #通過剪切板讀入數據
write.table(hightem, file = "hightem.txt", quote = FALSE)  #將這個數據保存一邊下次使用

lowtem<-read.table(file = "lowtemperature.prn", header = TRUE)
#(2)然後進行合併
colnames(hightem)<-c("day","year","hightem")  #由於變量名稱大小寫不一致,對最高溫度的數據集變量名稱進行重命名

tem<-merge(hightem, lowtem, by=c("year", "day"))

tem$day<-as.Date(tem$day)

#(3)合併後有一個問題就是時間序列被打亂了
#暫時解決辦法是把文件寫入csv文件,用excel重新編輯日期,並排序後重新導入

tem_new<-read.csv(file = "tem.csv", header = TRUE)
head(tem_new)

#3.7 讀入excel格式的文件####
install.packages("RODBC")  #注意有些包只在特定版本中能夠運行,更新問題
library(RODBC)

xls<-odbcConnectExcel("wechat.xls")  #odbcConnectExcel is only usable with 32-bit Windows


###4. 常用的函數####

##4.1 tapply函數(用來對某數值變量依據另外一個分類變量求某值)####
setwd("F:/feiguR")

tem_new<-read.csv(file = "tem.csv", header = TRUE)  
head(tem_new)
str(tem_new)

tapply(tem_new$lowtem, tem_new$year, mean)  #計算最低氣溫均值
tapply(tem_new$hightem, tem_new$year, mean)  #計算最高氣溫均值
tapply(tem_new_lowtem, tem_new$year, sd)   #計算最低氣溫方差

###4.2 sapply()函數 和 lapply()函數(對多個變量求某函數的結果)####
sapply(tem_new[,4:5], mean) #輸出爲向量
lapply(tem_new[,4:5], mean)  #輸出爲列表

##4.3 summary()函數  用來輸出彙總信息####
a<-summary(tem_new)

b<-summary(tem_new$year)

c<-summary(c(1,2,3,4,5,6,7,8,9))

d<-lm(tem_new$hightem~tem_new$lowtem)

e<-summary(d)

class(a);class(b);class(c);class(d);class(e)   #summary函數的輸出非常豐富,是一種列表

e$coeeficients

###4.4. table函數  (用於單變量的頻數統計,多分類變量的交叉分析)####

example("table")  

#4.4.1 簡單的頻數統計####
rpois(100,5)
table(rpois(100,5))

#4.4.2 查看錶的結構(可用於對數據框中兩個分類變量進行交叉分析)####
View(warpbreaks)
with(warpbreaks, table(wool, tension))

###5. 繪圖工具 ####

#5.1 基本繪圖函數plot() ####
View(cars) 
help(cars)    #速度與剎車距離

head(cars)

plot(cars)

plot(cars$dist~cars$speed)   #指定y軸表示剎車距離

plot(cars$speed~cars$dist)   #指定x軸表示剎車距離

#5.2 爲了方便將兩幅圖在一起進行對比####
windows()  #用單獨的窗口顯示圖形以獲得更好的顯示效果,注意windows命令在前

par(mfrow=c(2,2))

plot(cars$dist~cars$speed) 

plot(cars$speed~cars$dist)

#5.3函數的參數####
plot(cars$dist~cars$speed,  #y~x
     main="剎車距離與車速之間的關係",  #畫標題
     xlab="Speed(miles per hour)",       #X座標軸標題
     ylab = "Distance travelled(miles)",     #y座標軸標題
     xlim = c(0,30),  #x座標軸範圍
     ylim = c(0,140),     #y座標軸範圍
     xaxs = "i",    #設置x軸風格爲internal
     yaxs = "i",     #設置y軸風格爲internal
     col = "red",    #設置散點的顏色爲紅色
     pch = 19         #設置散點的形狀爲實心圓點
)

#5.4 繪製線圖 ####

#使用微信公衆號數據
setwd("...")

num<-read.csv(file = "wechat.csv")
head(num)

windows()
plot(num$NetGrowth~as.Date(num$date),
     type="1",
     main="每日淨增長變化",
     xlab="date",
     ylab="每日淨增長人數",
     col = "red"
)

##5.5 低水平繪圖函數lines() ####
lines(num$NetGrowth~as.Date(num$date),col = "red")

example("lines")

plot(cars, main = "Stopping Distance versus Speed")

lines(stats::lowess(cars))  #此代碼爲散點圖加上光滑的曲線

#5.6 柱形圖####
#使用數據集BOD
View(BOD)

#使用基礎繪圖包
barplot(BOD$demand, names.arg = BOD$Time)
#先輸出頻數表,然後在用條形圖繪製
table(mtcars$cyl)
barplot(table(mtcars$cyl))

#改變圖形的方向
windows()
par(mfrow=c(1,2))
barplot(BOD$demand, names.arg = BOD$Time)
barplot(BOD$demand, names.arg = BOD$Time, horiz = TRUE)


#5.7 繪製直方圖####
windows()
par(mfrow=c(1,2))
hist(mtcars$mpg)

hist(mtcars$mpg, breaks = 10)   #控制分區數目

#5.8 繪製箱線圖####
#使用數據集ToothGrowth
View(ToothGrowth)
#使用plot函數時,當x軸爲分類變量,y軸爲數值型變量時,默認輸出箱線圖
plot(ToothGrowth$supp, ToothGrowth$len)


#5.9 繪圖設備(輸出圖形的格式)####
?device

setwd("F:/feiguR")
pdf("fly.pdf")   #在圖形設備中輸出圖形名稱
plot(ToothGrowth$supp, ToothGrowth$len) 
dev.off()    #關閉當前圖形設備,相當於保存該圖形


png("fly.png")
plot(ToothGrowth$supp, ToothGrowth$len) 
dev.off() 


pdf("xxx.pdf")   #在你希望將所有圖形輸出到一個文件中時,這樣做不支持PNG格式
hist(mtcars$mpg)
hist(mtcars$mpg, breaks = 10)
plot(ToothGrowth$supp, ToothGrowth$len) 

dev.off()

#圖形設備設置

dev.cur()           #查看當前正在使用的圖形設備
dev.set(3)       #把當前正在使用的圖形設備設置爲其他設備

#5.10 其他常用圖形####
example("pie")        #查看餅圖的使用方法和實例

example("plot.ts")

#5.11 繪圖參數####

setwd("F:/feiguR")
wec<-read.csv(file = "wechat.csv", header = TRUE)

head(wec)
windows()
plot.ts(wec$NetGrowth, col="red")
points(wec$NetGrowth, bg="skyblue", color="red", pch=21)
abline(h=mean(wec$NetGrowth), col="blue")
title("公衆號日增淨關注人數變化")
box()

#5.12 生成時間序列的函數####

ts(1:10, frequency = 4, start = c(1959,2))   #生成時間序列,季度,起始

print(ts(1:10, frequency = 7, start = c(12,2)), calendar = TRUE)    #星期 日曆

gnp<- ts(cumsum(1+round(rnorm(100),2)), start = c(1954,7), frequency = 12) 
z <- ts(matrix(rnorm(300), 100, 3), start = c(1961,1), frequency = 12)
class(z)
head(z)
plot(z)


###6. R語言與統計####

###7. 循環與自定義函數####
#7.1 for循環####
example("for")

for (i in 1:5) {     #循環遍歷每個數,每取出一個數就打印一個向量
  print(1:i)
}

for (n in c(2,5,10,20,50)) {  
  x <- stats::rnorm(n)    #生成含有n個數的正態分佈
  cat(n, ":", sum(x^2), "\n")  #對應每一個數,計算生成的正太分佈數組的平方和
}

f<-factor(sample(letters[1:5], 10, replace = TRUE));f    #抽樣,生成字母序列

for (i in unique(f)) {  #依次去除序列中的每一個獨有的值
  print(i)
}

#7.2 while語句####
a[1]<-1; i<-1

while(a[i] < 100){
  i = i + 1;
  a[i] <- a[i-1]+3
}


#7.3 自定義函數####
myfunc_cv<-function(x){   #函數在R中也是一個對象
  cv<-sd(x)/mean(x)
  return(cv)       #變異係數
}


#測試該函數
a<-c(1,2,5,8,9,6)
myfunc_cv(a)

#7.4 通過循環和自定義函數來驗證中心極限定理####
myfun<-function(a){
  x<-1:100   #先生成一個1到100的序列,後面可以更改這些值,相當於覆蓋掉原來的值
  x<-data.frame(x)
  a<-data.frame(a)
  
  for (i in 1:100) {     #設置循環,循環抽取100個樣本,並將計算出來的均值付給數據框中的x變量
    c<-a[sample(nrow(a), 1000),]
    m = mean(c)
    x$x[i] = m
  }
  
  windows(1280,720);par(mfrow=c(1,2))
  plot(density(a$a),main="這是原來的分佈")
  plot(density(x$x), main = "這是抽取的樣本的均數的分佈")
}

a<-c(1:1000)
myfun(a)

###7.4.1 正態分佈####
a<-rnorm(10000,0,1)
myfun(a)

###7.4.2 指數分佈####
b<-rexp(10000,1)
myfun(b)

###7.4.3 t分佈####
c<-rt(1000,3)
myfun(c)

###7.4.4 F分佈####
d<-rchisq(100000,1)
myfun(d)


###8.數據處理####

###8.1 把數據框變長####


其中的條目最後的四個'#'號是做成目錄的一個代碼(必須只能是四個‘#’號),在RStudio中可以直接在代碼編輯框下面選擇。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章