R語言基礎入門


請先安裝好R和RStudio

參考:https://zhuanlan.zhihu.com/p/63987149

如果不干別的,控制台就是一個內置計算器

2 * 3  #=> 6
sqrt(36)  #=> 6, square root
log10(100)  #=> 2, log base 10
10 / 3  #=> 3.3, 10 by 3
10 %/% 3  #=> 3, quotient of 10 by 3
10 %% 3  #=> 1, remainder of 10 by 3 余數 

分配符

a <- 10  # assign 10 to 'a'
a = 10  # same as above
10 -> a  # assign 10 to 'a'
10 = a  # Wrong!. This will try to assign `a` to 10.類

類或者數據類型 

R語言基於變量被賦予的值的屬性自行決定變量類型,而非刻意定義變量類型

 更改變量類型

R語言中變量類型有無窮個,因為可以自由定義新的類,當然,一些常用的類有以下:

變量類型

  • character – Strings
  • integer – Integers
  • numeric – Integers + Fractions 整數和小數
  • factor – Categorical variable where each level is a category 類型變量
  • logical – Boolean
  • complex – Complex numbers 復數

數據類型

  • vector – A collection of elements of same class 向量
  • matrix – All columns must uniformly contain only one variable type. 矩陣 所有列都包含同一種變量類型
  • data.frame – The columns can contain different classes. 每一列可以包含不同的類
  • list – Can hold objects of different classes and lengths 可以包含不同類及不同長度的對象

R語言包及下載

R是一種開源語言,有很多包,實現不同的功能

install.packages("car")  # install car package 下載離你所在地方最近的CRAN鏡像的包 

  調用包之前,需要初始化

library(car)  # initialize the pkg 'car'  初始化
require(car)  # another way to initialize 初始化
library()  # see list of all installed packages 列出所有以及下載的包
library(help=car)  # see info about 'car' pkg 關於包的信息

獲得幫助 

help(merge)  # get help page for 'merge'
?merge  # lookup 'merge' from installed pkgs 從以及下載的包中查找
??merge  # vague search 模糊查詢
example(merge)  # show code examples 展示代碼案例

工作目錄

getwd()  # gets the working directory 獲取當前目錄
setwd(dirname)  # set the working directory to dir name 設置工作目錄 名稱只能用 / 或者 \\ 分割 

導入導出數據

R語言最常見最方便導入的數據格式是csv文件,也有其他包可以導入xlsx、數據庫文件

myData <- read.table("c:/myInputData.txt", header = FALSE, sep="|", colClasses=c("integer","character","numeric") # import "|" separated .txt file
myData <- read.csv("c:/myInputData.csv", header=FALSE)  # import csv file 可以用colClass來人為設定數據框中每列的數據類型,這樣處理效率更高,否則是自動識別數據類型的。
write.csv(rDataFrame, "c:/output.csv")  # export  

如何瀏覽 刪除控制台的對象

當創建新的變量時,默認在全局環境獲得存儲空間

a <- 10
b <- 20
ls()  # list objects in global env 列出全局環境中所有對象
rm(a)  # delete the object 'a'
rm(list = ls())  # caution: delete all objects in .GlobalEnv 刪除全局環境中所有對象
gc()  # free system memory 釋放系統內存

也可以創建新的環境來存儲變量,可以把環境想象成一個包含對象(變量)的容器,最外面的主要環境就是全局環境,而環境容器本身也是對象,所以說可以在全局環境中創建很多個新的環境對象,只是說如果想進入新創建的環境,必須明確告訴R你想看哪一個子環境。

rm(list=ls())  # remove all objects in work space
env1 <- new.env()  # create a new environment
assign("a", 3, envir = env1)  # store a=3 inside env1
ls()  # returns objects in .GlobalEnv
ls(env1)  # returns objects in env1
get('a', envir=env1)  # retrieve value from env1

創建向量

使用函數 c(). 創建向量,向量中所有元素類型必須一致,如果不一致,會自動轉換為統一類型元素

vec1 <- c(10, 20, 15, 40)  # numeric vector
vec2 <- c("a", "b", "c", NA)  # character vector
vec3 <- c(TRUE, FALSE, TRUE, TRUE)  # logical vector
vec4 <- gl(4, 1, 4, label = c("l1", "l2", "l3", "l4"))  # factor with 4 levels

length(vec1)  # 4
print(vec1[1])  # 10 從1開始索引 
print(vec1[1:3])  # 10, 20, 15 

 盡管可以隨意增加向量中的元素,但是初始化向量的長度仍然很有必要,因為這樣可以節約運行時間,只需要往索引的位置填補新元素,特別是當數據量很大的時候,如下所示

numericVector <- numeric(100) # length 100 elements 

對向量進行操作

切片

logic1 <- vec1 < 15  # create a logical vector, TRUE if value < 15
vec1[logic1]  # elements in TRUE positions will be included in subset 邏輯值為真的元素
vec1[1:2]  # returns elements in 1 & 2 positions.
vec1[c(1,3)]  # returns elements in 1 & 3 positions 位置1 3處元素

排序

sort(vec1)  # ascending sort 升序
sort(vec1, decreasing = TRUE)  # Descending sort 降序

或者

vec1[order(vec1)]  # ascending sort
vec1[rev(order(vec1))]  # descending sort

自定義向量排列

seq(1, 10, by = 2)  # diff between adj elements is 2 相鄰元素差為2
seq(1, 10, length=25)  # length of the vector is 25 向量長度是25
rep(1, 5)  # repeat 1, five times. 重復1 五次
rep(1:3, 5)  # repeat 1:3, 5 times
rep(1:3, each=5)  # repeat 1 to 3, each 5 times.

 刪除缺失值

vec2 <- c("a", "b", "c", NA)  # character vector
is.na(vec2)  # missing TRUE 返回一個缺失值處為真的邏輯向量
!is.na(vec2)  # missing FALSE
vec2[!is.na(vec2)]  # return non missing values from vec2 返回非缺失值

 抽樣

sample(x, size, replace = FALSE, prob = NULL)

set.seed(100)  # optional. set it to get same random samples. 設置隨機數
sample(vec1)  # sample all elements randomly 把所有元素打亂順序
sample(vec1, 3)  # sample 3 elem without replacement 抽取三個元素 3是抽樣后得到的樣本數量
sample(vec1, 10, replace=T)  # sample with replacement 意思是抽取的元素可以相同

#對數據框抽取
data=1:10
#抽取列
sample(x=data,size=1,replace=T)  
#抽取行
data[sample(nrow(data),2,replace=F),]

#按比例抽取
set.seed(1234)
#按7:3的比例產生了1和2
index <- sample(x = 2,size = nrow(data),replace=TRUE,prob = c(0.7,0.3))
traindata <- data[index == 1,]
testdata <- data[index == 2,]

#按照某個字段分層抽取
result<-data.frame()
data<-data.frame(a=c(1,2,3,4,6,7,8,5,11,12),b=c(2,3,4,5,65,4,6,6,8,9),s=c('A','B','A','A','B','A','B','A','B','B'))
subdata<-split(data,data$s) #按照s變量中的類型分類成列表
for(i in 1:length(subdata)){
    sub<-subdata[[i]]
    x<-sub[sample(nrow(sub),2,replace=F),] #每個列表元素中抽取兩行
    result<-rbind(result,x) #rbind函數 按照行疊加起來
}
result

 數據框

數據框是一種很便於進行數據分析的數據對象,R讀取csv文件時也是以數據框形式讀取的,可用向量創建數據框,R語言也有很多內置的數據框格式數據集

myDf1 <- data.frame(vec1, vec2)  # make data frame with 2 columns
myDf2 <- data.frame(vec1, vec3, vec4)
myDf3 < data.frame(vec1, vec2, vec3)

library(datasets) # initialize
library(help=datasets) # display the datasets

#下面一些基本操作代碼會經常用到 
class(airquality)  # get class
sapply(airquality, class)  # get class of all columns
str(airquality)  # structure
summary(airquality)  # summary of airquality
head(airquality)  # view the first 6 obs
fix(airquality)  # view spreadsheet like grid
rownames(airquality)  # row names
colnames(airquality)  # columns names
nrow(airquality)  # number of rows
ncol(airquality)  # number of columns

# cbind  rbind 為數據框添加行和列
cbind(myDf1, myDf2)  # columns append DFs with same no. rows
rbind(myDf1, myDf1)  # row append DFs with same no. columns

對數據框進行切片操作

myDf1$vec1  # vec1 column
myDf1[, 1]  # df[row.num, col.num]
myDf1[, c(1,2)]  # columns 1 and 2
myDf1[c(1:5), c(2)]  # first 5 rows in column 2

#也可以使用 subset() 和 which() 函數 which() 返回符合條件的行或列向量
subset(airquality, Day == 1, select = -Temp)  # 選擇 Day=1 剔除 'Temp'
airquality[which(airquality$Day==1), -c(4)]  # 作用同上

抽樣 

把數據分為訓練數據集和驗證數據集

set.seed(100)
trainIndex <- sample(c(1:nrow(airquality)), size=nrow(airquality)*0.7, replace=F)  # get test sample indices 0.7比例 靈活性
airquality[trainIndex, ]  # training data
airquality[-trainIndex, ]  # test data

合並數據框

可以通過共同的列變量進行合並,merge()函數的不同參數可以實現內join,left join,right join以及完整join

merge(x, y, by = intersect(names(x), names(y)), by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all, sort = TRUE, suffixes = c(".x",".y"), incomparables = NULL, ...)

x: 第一個數據框

y: 第二個數據框

by,by.x,by.y:用於連接兩個數據集的列,intersect(a,b)值向量a,b的交集,names(x)指提取數據集x的列名 by = intersect(names(x), names(y)) 是獲取數據集x,y的列名后,提取其公共列名,作為兩個數據集的連接列, 當有多個公共列時,需用下標指出公共列,如names(x)[1],指定x數據集的第1列作為公共列 也可以直接寫為 by = ‘公共列名’ ,前提是兩個數據集中都有該列名,並且大小寫完全一致,R語言區分大小寫

all, all.x, all.y: 指定合並類型的邏輯值。缺省為false,all=FALSE (僅返回匹配的行).

最后一組參數all, all.x, all.y需要進一步解釋,決定合並類型。

內 join: 僅返回兩數據框中匹配的數據框行,參數為:all=FALSE.

outer join: 返回兩數據框中所有行, 參數為: all=TRUE.

Left outer join: 返回x數據框中所有行以及和y數據框中匹配的行,參數為: all.x=TRUE.

Right outer join: 返回y數據框中所有行以及和x數據框匹配的行,參數為: all.y=TRUE.

sort:by指定的列是否要排序.

suffixes:指定除by外相同列名的后綴.

incomparables:指定by中哪些單元不進行合並.

  • inner 模式匹配,只顯示兩個數據集公共列中均有的行

# 有多個公共列時,需指出使用哪一列作為連接列merge(x,y,by=intersect(names(x)[1],names(y)[1]))

# 當兩個數據集連接列名稱同時,直接用by.x,by.y 指定連接列merge(x,y,by.x ='name',by.y ='name') 

# 當兩個數據集均有連接列時,直接指定連接列的名稱merge(x,y,by='name')

  • outer 模式,將兩張表的數據匯總,表中原來沒有的數據置為空

merge(x, y, all=TRUE, sort=TRUE)

# all = TRUE 表示選取x, y 數據集的所有行,sort = TRUE,表示按 by 列進行排序,默認升序

  • left 匹配模式

merge(x ,y,all.x=TRUE,sort=TRUE)

# 多個公共列 末指定連接列 ,左連接,設置 all.x = TRUE,結果只顯示數據x的列及x在y數據集中沒有的列

merge(x, y, by = 'name',all.x = TRUE, sort = TRUE) # 多個公共列 指定連接列指, 左連接,設置 all.x = TRUE,結果只顯示x所有names(x)[1]值

  • right 匹配模式

merge(x ,y ,by='name',all.y=TRUE,sort=TRUE) 

# 多個公共列指定連接列# 左連接,設置all.y =TRUE,結果只顯示y所有names(y) [1] 值的記錄

paste 函數

連接字符串,自定義字符串模式

paste("a", "b")  # "a b"
paste0("a", "b")  # concatenate without space, "ab"
paste("a", "b", sep="")  # same as paste0
paste(c(1:4), c(5:8), sep="")  # "15" "26" "37" "48"
paste(c(1:4), c(5:8), sep="", collapse="")  # "15263748"
paste0(c("var"), c(1:5))  # "var1" "var2" "var3" "var4" "var5"
paste0(c("var", "pred"), c(1:3))  # "var1" "pred2" "var3"
paste0(c("var", "pred"), rep(1:3, each=2))  # "var1" "pred1" "var2" "pred2" "var3" "pred3

處理日期字符串

dateString <- "15/06/2014"
myDate <- as.Date(dateString, format="%d/%m/%Y")
class(myDate)  # "Date"
myPOSIXctDate <- as.POSIXct(myDate)  # convert to POSIXct

 查看R對象的內容

attributes(myPOSIXltDate)  # best
unclass(POSIXltDate)  # works!
names(myPOSIXltDate)  # doesn't work on a POSIXlt object
unlist(myPOSIXltDate)  # works!

object.size(myDate)  # 216 bytes
object.size(myPOSIXltDate)  # 1816 bytes
object.size(myPOSIXctDate)  # 520 bytes

列聯表

test <- c(1,2,3,2,1,1,5,6,4,5,1)
test1 <- table(test)
test1
test
1 2 3 4 5 6   #test中的元素
4 2 1 1 2 1   #各個元素出現的頻率
#提取table()中的元素
names(test1)
[1] "1" "2" "3" "4" "5" "6"
#提取table()中的頻率
as.numeric(test1)
[1] 4 2 1 1 2 1
#3.進階,提取table()中指定頻率的數據,先用as.data.frame()轉換
test2 <- as.data.frame(test1)
test2
  test Freq
1    1    4
2    2    2
3    3    1
4    4    1
5    5    2
6    6    1
test2[which(test2$Freq==1),]  #提取出現頻率為1的元素
  test Freq
3    3    1
4    4    1
6    6    1

列表

列表是R語言中的對象,它包含不同類型的元素,比如 - 數字,字符串,向量和另一個列表等。一個列表還可以包含一個矩陣或一個函數作為它的元素。使用list()函數創建列表。

# Create a list containing strings, numbers, vectors and a logical values.
> list_data <- list("Red", "Green", c(21,32,11), TRUE, 51.23, 119.1)
> print(list_data)
> print(list_data)
[[1]]
[1] "Red"
[[2]]
[1] "Green"
[[3]]
[1] 21 32 11
[[4]]
[1] TRUE
[[5]]
[1] 51.23
[[6]]
[1] 119.1

命名列表元素

# Give names to the elements in the list.
 names(list_data) <- c("1st Quarter", "A_Matrix", "A Inner list")

訪問列表元素

print(list_data[1])#使用元素索引訪問
print(list_data$A_Matrix)#使用名稱訪問

操控列表元素

list_data[3] <- "updated element"#更新
list_data[4] <- NULL #刪除
# Create two lists.
list1 <- list(1,2,3)
list2 <- list("Sun","Mon","Tue")
# Merge the two lists.
 merged.list <- c(list1,list2)

轉換列表為向量

# Convert the lists to vectors.
v1 <- unlist(list1)

條件語句

if(checkConditionIfTrue) {
  ....statements..
  ....statements..
} else {   # place the 'else' in same line as '}'
  ....statements..
  ....statements..
} 

for 循環

for(counterVar in c(1:n)){
  .... statements..
}

Error handling with tryCatch()

tryCatch({1 <- 1; print("Lets create an error")}, # First block
error=function(err){print(err); print("Error Line")},  # Second Block(optional)
finally = {print("finally print this")})# Third Block(optional)
#=> [1] "Lets create an error"
#=> <simpleError in 1 <- 1: invalid(do_set) left-hand side to assignment>
#=> [1] "Error Line"
#=> [1] "finally print this"

參考:

http://r-statistics.co/R-Tutorial.html

https://www.jianshu.com/p/148a399b61d3

https://blog.csdn.net/neweastsun/article/details/79435271

https://blog.csdn.net/wlt9037/article/details/76570155

https://www.jianshu.com/p/9d52cd5aa6d9

 


免責聲明!

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



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