R語言基礎


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

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM