1、R語言介紹
R和RStudio 是與計算機進行對話的兩個工具
RStudio 是話筒
R是溝通所用的語言
R的由來:基於S語言,由新西蘭奧克蘭大學的Robert Gentleman和Ross Ihaka開發,因兩位開發者名字首字母都是R,所以該語言命名為R。
怎樣理解R
一種計算機語言
一種用於統計分析、繪圖的操作環境
用戶接口
R 語言特點
R 是一款開源、免費的軟件,可以跨平台運行
R 提供了非常豐富的統計分析技術
有很多非常實用並包含最新技術的R包,而且更新速度非常快
R的繪圖功能十分強大
軟件界面:
配置文件,選擇SDI單窗口
選擇save進行直接保存修改,不需要更改路徑
效果圖:
R環境下的提示符:
2、R包的安裝
下載包:
查看所有包的命名:
(.packages(all=T))
加載包命令:
# 使用下載后的包首先得加載包
#library(cjava)
沒有任何提示表示結果正常
輸入錯誤按Esc鍵重新輸入
取消命令:ctrl+c
向量的長度=向量的個數
字符串向量,雙引號 “ ”
c函數:拼接功能
同時下載兩個包
install.packages(c("reshape2","dplyr"))
創建R對象
R語言區分大小寫
對象sz
<-賦值符號
1:6數值
sz<-1:6
連續賦值:
ls()函數調取所有對象
get()函數得到變量的數值
刪除對象:
刪除所有對象
rm(list=ls())
統計函數
sum()
sz+1:2
sz+1:4
元素方式運算
R使用元素執行方式運算的機制:匹配向量,獨立操作每對元素 如果兩個向量長度不等,R會在較短的向量上重復 以上這種行為在R中被稱為向量循環,幫助R執行元素方式運算 矩陣乘法:當需要使用矩陣乘法時,需要做出專門的請求 計算向量的內積:sz %*% sz 計算向量的外積:sz %o% sz 轉置:t() 計算矩陣的行列式:det()
sz*sz 平方運算
sz%*%sz 一行一列
sz%o%sz
c(2,5,6,8)%o%c(3,7)
項目一:
用sample()函數,抽取1:6的隨機數,抽取兩次
sample函數可以完成隨機抽樣處理,其基本形式為:
sample(x, size, replace = FALSE)
replace=False 表示不可放回抽樣
用replicate()函數執行100次
replace=TRUE/replace=T可放回抽樣
基於名稱的傳參和基於位置的傳參
基於位置的傳參必須嚴格按照位置順序,否則出錯
自定義函數------------調用函數
練習:重復執行10次鄭色子,得到10個點數和
首先自定義函數,再調用函數
直接調用前面定義的函數
修改函數fix(函數名)
傳參處理:
生成等差數列函數seq
seq(...) ## Default S3 method: seq(from = 1, to = 1, by = ((to - from)/(length.out - 1)), length.out = NULL, along.with = NULL, ...) seq.int(from, to, by, length.out, along.with, ...) seq_along(along.with) seq_len(length.out)
輸出9個
伴隨向量:
生成步長為1的等差數列
乘方運算
繪制一個散點圖:兩個變量的關系
直方圖
直方圖的橫縱坐標都是連續的,強調的是數值連續的變化規律,可以表示兩個變量
> x<-c(1,2,3,3,3) > x [1] 1 2 3 3 3 > qplot(x)

qplot(x,binwidth=1)

當次數夠多滿足正態分布
zn<-replicate(10000,zsz(sk=1:6))
> qplot(zn,binwidth=1)

# 入樣概率 prob控制概率
> zsz function(sk){ skn<-sample(sk,size=2,replace=T,prob=c(1/8,1/8,1/8,1/8,1/8,3/8)) sum(skn) } > zn<-replicate(10000,zsz(sk=1:6)) > qplot(zn,binwidth=1)

#添加入樣概率,6點概率是其他點數概率的3倍 function(sk=1:6){ skn<-sample(sk,size=2,replace=T,prob=c(1,1,1,1,1,3)) sum(skn) }
向量的循環:
> rep(1:3,times=3) [1] 1 2 3 1 2 3 1 2 3 > rep(1:3,each=3) [1] 1 1 1 2 2 2 3 3 3 > rep(1:3,times=c(1,3,2)) [1] 1 2 2 2 3 3 >
字符串連接函數paste
paste()
其中...表示一個或多個R可以被轉化為字符型的對象;參數sep表示分隔符,默認為空格;
項目二-設計撲克牌模擬系統
要求:自動洗牌、發牌
任務一:創建一副牌。學會如何使用R的數據類型和數據結構。
任務二:編寫發牌和洗牌的函數。學習從一個數據集中抽取想要的數值。
任務三:改變點數系統。學習在數據的內部改變數據的取值
任務四:管理撲克牌的狀態。學習R的環境系統和作用域規則。
原子型向量
數據結構:數據結構是存儲、組織數據的方式,是數據內部的構成方法。 原子型向量:R里面最簡單的數據類型,是構成其他對象類型的基本元素。 原子型向量的特點:每個原子型向量都將一種類型的數據存儲在一個一維向量中。
原子型向量的分類: 雙整型:存儲普通的數值型數據;
> x1<-c(1,2,3,4,5,6) > x1 [1] 1 2 3 4 5 6
> is.vector(x1) [1] TRUE > length(x1) [1] 6
> typeof(x1) [1] "double"
整型:存儲整型的數據;
> int<-c(-1L,2L,4L) > int [1] -1 2 4
字符型:存儲文本型數據; 邏輯型:用來存儲TRUE和FALSE這兩個布爾數據。
> logic<-c(TRUE,FALSE) > logic [1] TRUE FALSE > typeof(logic) [1] "logical"
復數型和原始類型:分別來存儲復數和數據的原始字節。
is.vector():查看某個對象是否為向量。
typeof():查看某個對象的數據類型
#練習:生成一個原子型向量,來存儲同花順的牌面
同一種花色的順子,比如黑桃的 A 、 K 、 Q 、 J 、 10
R-屬性
屬性:附加給原子型向量的額外信息。
attributes():查看一個對象包含哪些屬性信息。
原子向量最常見的三種屬性:名稱、維度和類。每種屬性都有自己的輔助函數。
練習1:給骰子的每個點數命名,並查看。
命名向量:
> kl<-c(a=1,b=2) > kl a b 1 2
關於維度:dim()函數可以將一個原子型向量轉換為一個n維數組。
> dim(sz)<-c(2,3) > sz [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 >
練習2:將一個向量轉換為矩陣,並查看數據排列方式。
dim(sz)<-c(2,3,3)2行3列,切片3
練習3:用matrix()函數創建矩陣。
3行2列

2行3列
練習4:用array()函數創建數組。
2行3列,4個切片

typeof():查看某個對象的數據類型
R--類
類:新的結構,新的格式。 class():查看一個對象的類。
練習1:賦予向量以維度屬性,觀察其class屬性的變化。
用屬性系統表示更多的數據類型:日期時間與因子。
日期與時間:R用一個特殊的類來表示日期和時間數據。
POSIXct:一個被廣泛用於表示日期與時間的框架。
R處理規則:R函數在顯示該對象之前,會根據POSIXct標准將該時間轉換為用戶可以理解的字符串。
練習2:用Sys.time()函數查看當前系統時間,並查看該對象的類和類型。
> Sys.time() [1] "2019-12-05 21:37:24 CST" > now<-Sys.time() > now [1] "2019-12-05 21:37:57 CST"
練習3:用unclass()函數移除對象的class屬性。
> now [1] "2019-12-05 21:37:57 CST" > class(now) [1] "POSIXct" "POSIXt" > typeof(now) [1] "double" > unclass(now) [1] 1575553078
> #練習:1970年1月1日零點之后的100萬秒是哪一天? > mil<-1000000 > class(mil)<-c("POSIXct","POSIXt") > mil [1] "1970-01-12 21:46:40 CST"
R--因子
因子:存儲分類信息。
R中因子生成機制:R會將向量中的值重新編碼為一串整數值,再將編碼的結果存儲在一個整型向量中,
然后對其添加一個levels屬性和一個class屬性。其中levels屬性包含顯示因子值的一組標簽。
練習1:用factor()函數創建一個因子。
練習2:用as.character()函數將一個因子強制轉換為字符串。
問題:當在原子型向量中存儲多種類型的數據會發生什么問題呢?
integer整型向量
> xb<-factor(c("female","male","male","female")) > xb [1] female male male female Levels: female male > class(xb) [1] "factor" > typeof(xb) [1] "integer" > as.numeric(xb) [1] 1 2 2 1
強制轉換
R強制轉換所遵循的規則:
如果一個原子型向量包含字符串,R會將該向量中的所有元素都轉換成字符型。
如果一個原子型向量只包含邏輯型和數值型元素,R會將邏輯型全部轉換成數值型。
原因:單一數據類型的好處:數據操作更加直接和高效;而且就變量而言,變量中每個值度量的都是相同的屬性,
因此沒有必要使用不同的數據類型。

NA表示缺失值
> mn<-c("男","男","女") > mn [1] "男" "男" "女" > sum(mn=="男") [1] 2 > sum(mn=="女") [1] 1 > sum(mn=="男")/sum(mn) Error in sum(mn) : 'type'(character)參數不對 > sum(mn=="男")/sum(mn!="") [1] 0.6666667 > sum(mn=="男")/length(mn) [1] 0.6666667 > sum(mn=="男")/sum(c(mn=="男",mn=="女")) [1] 0.6666667 > mean(mn=="男") [1] 0.6666667
列表
列表:將數據組織在一個一維集合中。與原子型向量的區別在於,列表並不是將某些具體的值組織起來,而是組織R對象。
練習:用list()函數創建一個列表
[[]]:表示來自列表的哪一個元素。
雙索引系統:因為列表的元素可以是任意一種R對象。
列表的特點:R中全能型的存儲工具。
下面最外層的list有三個元素
命名:
二維表
> data.frame(姓名=c("張三","李四"),成績=c(100,90)) 姓名 成績 1 張三 100 2 李四 90
數據框
數據框:列表的二維版本。將向量組織在一個二維表格中,每一個向量作為這個表格一列。
需要注意的問題:
不同的列可以包含不同的數據類型;
每一列必須具有相同的長度;
每個向量都有自己的名稱;
stringsAsFactors參數應設置為FALSE。
練習:用data.frame()函數創建一副牌。
> data.frame(姓名=c("張三","李四"),成績=c(100,90))->df > df 姓名 成績 1 張三 100 2 李四 90 > typeof(df) [1] "list"
stringsAsFactors=F
> data.frame(姓名=c("張三","李四"),成績=c(100,90),stringsAsFactors=F)->df > df 姓名 成績 1 張三 100 2 李四 90 > str(df) 'data.frame': 2 obs. of 2 variables: $ 姓名: chr "張三" "李四" $ 成績: num 100 90
RStudio設置
#項目二-構建一副撲克牌
pkp<-data.frame(pm=rep(c("A",2:10,"J","Q","K"),times=4), hs=rep(c("紅桃","黑桃","梅花","方塊"),each=13), ds=rep(1:13,times=4), stringsAsFactors = F)
str(pkp) #查看pkp的前六條數據 head(pkp)
#查看pkp的前八條數據 head(pkp,n=8) #查看pkp的后六條數據 tail(pkp)
#查看當前的工作目錄 getwd() #設置工作目錄 setwd("C:\\Users\\Desktop\\DT") # 寫入外部文件 write.csv(pkp,file = "puke.csv",row.names = F)
# 小結 # 第一個角度:從數據類型的角度 #數據類型相同的,向量、矩陣、數組 #數據類型不同的:列表、數據框 # 第二個角度 #一維結構:向量、矩陣 #二維結構:矩陣、數據框 #三維或三維以上結構:數組
選中要運行的代碼,執行運行
# 必知必會的函數 #which\which.max()\which.min() # which:返回一個邏輯向量里面真值所在位置 which(c(T,F,T)) man<-c("男","男","女") # 計算向量里面男生所在位置 which(man=="男") # which.max():返回一個向量里面最大值所在位置 which.max(c(3,4,7)) # which.min():返回一個向量里面最大值所在位置 which.min(c(3,4,7)) # 排序 # 第一種:直接排序 x<-c(7,5,8,9,2) sort(x) x<-sort(x) #降序排序 sort(x,decreasing = T) # 第二種:間接排序 order(x) #第三種:倒着排 rev(x)
練習:
# 作業:編寫一個函數,具有如下功能: # 1.輸入參數為一個向量 # 2.計算向量的均值、方差、標准差、中位數 # 3.計算向量的標准化得分 # 4.將2與3中的計算結果存儲到一個列表中作為函數返回對象
f<-function(x){ mean<-mean(x) var<-var(x) sd<-sd(x) median<-median(x) zscore<-(x-mean(x))/sd(x) lst<-list(f.mean=mean,f.var=var,f.sd=sd,f.median=median,f.zscore=zscore) lst } f(c(1,3,5,7,9)) $f.mean [1] 5 $f.var [1] 10 $f.sd [1] 3.162278 $f.median [1] 5 $f.zscore [1] -1.2649111 -0.6324555 [3] 0.0000000 0.6324555 [5] 1.2649111