R语言基础学习(一)

2022-04-16  本文已影响0人  monkey_study

分享一下之前的笔记,顺带mark一下,减轻电脑存储负荷!

R语言基础学习

数据分析的过程
数据采集(笔记,python等)
数据存储
数据分析(统计):使用统计方法,有目的地对收集到的数据进行分析处理,并且读取分析结果。
数据挖掘:data mining,一般是指从大量的数据中通过算法搜索隐藏于其中信息的过程。数据挖掘算法:二元分类法,数据预测器,回归,贝叶斯网络,logistic回归,序列,时间序列,quest,C&R树,异常,特征选择,神经网络,K-mean,主成分分析/因子,SVM,genlin,Cox等
数据可视化
进行决策
我们为什么要做数据分析?通过数据分析得出的结果来指导决策

#数据  要分析与某事物相关的所有数据
#       接受数据的复杂繁复
#       关注数据之间的相关性
#例子  啤酒与尿布   男性购买啤酒时,常常会购买小孩子尿布,通过大量数据分析,发现两者之间的相关性,所以放在一起
#  路遥知马力,日久见人心    日子长了,对一个人的了解越来越多,即对这个人的数据更加了解,可以以此对他进行预测,判断。 
#通过分析一个人的朋友圈内容,判断性格类型 
#google利用大数据成功预测冬季流感



数据可视化

图形可以更好地展示工作效果或者更易让人理解

R语言

robert Gentleman(生物学家) and Ross Ihaka开发了R语言
robert Gentleman(生物学家) 开发了bioconductor 用于生物统计

#R用于计算
x<-1:100
min(x)
max(x)
mean(x)
sd(x)  #计算方差
?sd
sd(1:2) ^ 2
getwd()  #获取当前工作路径
options()   #更改默认设置
.First    
.Last
# alt+ -   快速赋值快捷键
#拟合方差分析模型   aov    analysis of variance model
?aov
# microsoft R open  
# R 语言分析步骤
#数据收集,数据存储,数据分析,数据挖掘,数据可视化,进行决策
# 数据集是粉色,蓝色是函数,表格是数据框,紫色的是包
#runif() 函数用于生成从min到max区间范围内的服从正态分布的随机数。
u<-runif(50,min = 1,max = 2)  
dunif(u)==u

操作小知识


#工作台中使用 Esc键 进行中断
# ctrl+ 向上箭头 可以查看之前的操作
# Alt+shift+K 显示Rstudio中的所有快捷操作

R基本操作####

getwd()  #work directory  #查看当前工作路径
setwd(dir = )  #设置更改工作路径,参数 dir="路径" 
list.files()  #显示当前工作目录中的文件
dir()  #显示当前工作目录中的文件
a <- 3  # <- 赋值符号   快捷键 alt+ -
mean(1,2,3,4,5)  #错误示例! #1
mean(1:5)  #求取平均值 #3 参数 x为对象,na.rm=T/F ,是否去除NA缺失值
?mean
ls()   #列出工作环境中的对象
str(a)  #显示数据结构
ls(all.names = T)  #参数显示所有对象的名称
?ls
rm(list = ls())   #列出当前环境对象后,remove对象
rm(a)  #rm 函数删除后,不能恢复 
rm(a,b)  #删除多个对象的值
history()  #列出历史记录
# ctrl+L  清空工作台屏幕
save.image()   #函数保留当前工作空间
q()  #退出R软件

R包的安装

# 打开镜像站点时,选择据离自己最近的!
install.packages("包的名称")  # 安装包
BiocManager::install("",update = F,ask = F) #从bioconductor安装包
library()  #不加参数查询已安装包
.libPaths()  #显示包的库所在位置 #[1] "D:/R/R-4.1.2/library"
library(package)  #加载包
# R软件自带R包有:base,datasets,utils,grDevices,graphics,stats,methods,splines,
# stats4,tcltk
#键入函数的名称,tab键后,可查看函数对应来源的包 
library(ggplot2)
require(ggplot2)  #加载包
help(package = "ggplot2")  #查看包的帮助文档
require(CLL)
detach(package:CLL)   #移除已加载的包  detach 解除绑定
summary(CLL)
remove.packages("CLL")   #从电脑上删除已安装的包,参数lib 以字符串向量形式给出包的安装目录
?remove.packages
library(CLL)  #再次加载CLL包,显示不存在该包
?detach
search()   #显示已加载且可用的包
installed.packages()   #列出已安装的包,及版本号,依赖关系等
update.packages()   #g更新已安装的包
chooseCRANmirror()   #选择镜像站点
chooseBioCmirror()  #选择镜像站点
install.packages("vcd")   #用于可视化类别数据的包
library(vcd)

R包在不同设备间的移植

installed.packages()   #查看已安装的包
Npackage<- installed.packages()[,1]   #保存R包的名字为Npackage
class(Npackage)   #类型为字符串
save(Npackage,file = "./Name of package.Rdata")  #把文件存为Rdata文件
load(file = "")   #加载对应路径的文件
# for(i in Npackage){install.packages(i)}    使用该循环函数自动安装Npackage中的包
?sav

R帮助文档的使用

help.start()    #打开帮助文档  或者用ctrl+3
?mean   #查看帮助
args(mean)   #列举出函数的默认参数  argument
example("example")   #查看函数的示例
example(mean)
demo(graphics)   #查看函数的示例图片  demographic
vignette()  #查看包的帮助文档
library(ComplexHeatmap)
vignette("ComplexHeatmap")   
help.search("heatmap")   #检索本地包中的某个函数的帮助信息
apropos("ggplot")   #函数返回一个字符串向量给出检索列表匹配的对象的名字,本地搜索
apropos("ggplot",mod="function")   #搜索本地文件 ggplot函数(mod设定搜索类型为function)
find("ggplot")  #返回给定名字的对象的位置,寻找函数对应的包!!!
apropos("^.$")  #一个字母长度的物体   
?apropos
?RSiteSearch   #搜索帮助页面,背景插图或者任务视图中的关键词或者词组,在浏览器中的R语言官网搜索引擎中查看他们
RSiteSearch("ComplexHeatmap",restrict = "vignette")  #连接到R官网,按照restrict限制类型搜索complexHeatmap对应信息
# restrict参数有function,vignette,以及views
# Rseek.org  网站   社群  可以问问题

R内置数据集

help(package = "datasets")  #打开datasets包的帮助文档
data()   #显示内置数据集,列举可获得的数据集
?data
rivers
rivers<-c(1,2,3)
rivers
data("rivers")  #重新载入rivers数据集
names(euro)   #输出向量的名字信息,用于获得或者设置对象的名字
example("names")
args(names)  #展示函数的参数
?names
heatmap(volcano,cexRow = 0.4,cexCol = 0.4,scale ="row" )  #热图绘制函数
#所有的参与热图的数值是否做Z-score处理,并且是对数值的每一列处理还是每一行处理。

数据结构

#数据类型
# 数值型,可直接用于计算,加减乘除等
# 字符串型,可以进行连接、转换、提取
# 逻辑型,判断真假
# 日期型等;
### 对象  :object,指可以赋值给变量的任何事物。包括常量,数据结构,函数,甚至图形。对象都具有某种模式,描述了此对象是如何存储的,以及某个类。
sink("myoutput",append = T,split = T)  #发送R脚本到一个文件,append追加文本,split将输出同时发送到屏幕和输出文件中。
# 数据集,行表示观测,列表示变量
?sink
pdf("mygraphs.pdf")  #保存为pdf文件
sink()
dev.off()   #将数据返回终端
getwd()
data()
## 向量:vector,构成其他数据结构的基础。有一个或多个元素构成。用于存储数值型,字符串型或逻辑性数据的一组数组。
# 由函数c来创建向量。
a<-c(1,2,3)  #数值型向量
typeof(a)
class(a)
y<-c("2",'3','4')  #字符型向量
y
class(y)
m<- c(T,F,T)   #逻辑型向量
class(m)
###其他创建向量的方式
seq(from=1,to=100,by=4)
seq(from=1,to=100)   #产生等差序列的函数
rep(1,2)    #重复函数
1:10   #从一到10
# rep(x = 2,each=5,times=2)   2每个输出5个,重复2次
mode(m)   #查看数据类型
# 向量化编程
x <- c(1,2,3,4,5)
y<-c(7,7,8,9,10)
x*2+y
x[x>3]
rep(x,c(2,4,6,1,3))   #对向量x进行重复,用向量控制x中每个元素重复次数

向量索引

## 正整数索引
x<-c(1:100)  #创建向量
x  #输出x
length(x)   #查看向量长度
x[1]   #按照位置提取向量中的元素
x[0]
x[-19]   #访问第十九个元素以外的其他元素
x[c(4:18)]   #访问x中对应向量位置的元素
## 逻辑值索引
y <- c(1:10)
y[c(T,F,T,F,T,F,T,F,T,F)]
y[c(T)]
y[c(T,F,T)]  #按照顺序对应循环判断并输出为T的元素
y[rep(c(T,F,T),3)]
y[y>2&y<7]
 # && 操作符仅用于长度为1的 vector,因此它只会返回 vector 中第一项的比较结果,即 FALSE。
### 字符串型向量元素的索引
d<-c('1','3','4','sdw','dsdw')
# %in% #用于判断元素是否在数据集中,返回逻辑值
1%in% d 
sdw %in% d
d["dsdw"%in%d]
d[d %in% c("1","3")]
names(d)<-c(1,2,3)  #给向量d中的元素按照位置信息对应命名
d
?names
d["2"]   #通过名称访问数据集中的值,在后续的数据框中可通过列名,访问该列数据
euro  #R内置数据中的一个向量
euro["ATS"] 
x
x[101]<-101  #添加元素
x
p<-c(1:3)
p[20]<-4  #在第20个位置上添加元素
p
append(p,values = 30,after = 3)   #在p的第三个元素后追加30
rm(p)   #删除向量
x<-x[-c(1:3)]   #删除向量中第1到3个元素
x

向量运算

x+1  #向量x中的每个元素均加1
x<-x-10
y<-seq(1,5,3)
y
x
x+y   #较短的y元素循环与x中的元素加和
## 逻辑运算
x>5
x<--6:6
abs(x)  #计算绝对值
sqrt(x)  #计算x的平方根
log(x)   #对数
exp(x)   #计算指数函数
ceiling(c(-2.3,3.145))   #向上取整
floor(c(2.6,3.1))  #向下取整
trunc(c(2.6,3.1))   #返回整数部分
round(c(1.6,3.45454),digits = 3)   #保留小数点位数,四舍五入
signif(c(1.6,3.45454),digits = 3)  #与round函数类似
sum()  #求和   min(x)   max()  mean()  均值
var(x)    #求方差
sd(x)  #求标准差
round(sd(x),digits = 2)  #求标准差且结果保留2位小数
prod(x)  #求取连乘的积
median(x)  #求中位数
quantile(x)  #求取四分位数
quantile(x,c(0.2,0.3,0.6))  #分别计算20%,30%,60%位数
t<-c(1,4,5,6,7)
which(t==5)  #返回t等于5的值的位置

矩阵

# 矩阵(matrix)是一个按照长方阵列排列的复数或实数集合,是二维的,需要行与列。
# 矩阵中的元素可以是数值型、逻辑型、字符型,但同一矩阵中的元素需要时同一个模式。
x<-matrix(1:20,nrow = 4,ncol = 5)  #创建矩阵并赋值给x
x #输出x
class(x)  #查看数据类型 "matrix" "array" 
rnames<-c(paste("R",1:4,sep = ""))
cnames <- c(paste("C",1:5,sep = ""))
x<-matrix(1:20,nrow = 4,byrow = T,dimnames = list(rnames,cnames))  #数据默认按照列排列,byrow=T调整为按照行排列,参数dimnames以列表形式为行列命名
x
dim(x)  #显示数据集的维度信息 4行5列
x<-1:20
dim(x) <- c(2,2,5)   #可以用来定义数据集的维度
x  #此时x从向量变成了三维数组array
 class(x)  #[1] "array"
 ### 数组
 dim1 <- c("A1","A2")
 dim2<-c("B1","B2","B3")
 dim3 <- c("C1","C2","C3","C4")
 z <- array(1:24,dim = c(2,3,4),dimnames = list(dim1,dim2,dim3))
z
# 矩阵、数组数据的访问  #可以通过下标进行访问
x[1,2,3]
x[1,c(1,2),3]
# 通过行列名提取数据
x["C1"]
colSums()   rowSums()   rowMeans()  #计算行列的和或者平均值
#矩阵行列转置
o<-matrix(1:30,5,6)
t(o)  #从5行六列到 6行5列

列表

#列表就是一些对象的有序集合。可以是多个向量,矩阵,数据框甚至列表的组合。
g<-"my first list"
h <- c(25,18,24,34)
j <- matrix(1:20,4,5)
l<-c("noe","toe","wes")
mylist <- list(g,h,j,l)
mylist
mylist <- list(title=g,sdsd=h,j,l)   #可以为列表中的对象命名
mylist
# 列表中的元素提取
mylist[1]  #提取第一组字符串
mylist[c(1,4)]  #用向量来提取多组数据(第一组和第四组数据)
mylist$title   #数据框和list可以用$提取对应的数据
mylist["title"]  #根据名称字符串提取数据
class(mylist[1])  #使用一个中括号输出的数据类型依旧是list
class(mylist[[1]])   #两个中括号可以访问list中存储的各类数据类型
#对list中赋值的操作也要使用两个中括号!
mylist$title <- NA  #使用该操作清空对应list的值
mylist

数据框

##数据框是比较规则的列表
patientID <- c(1,2,3,4)
age <- c(25,34,28,52)
diabetes <- c(rep(c("Type1","Type2"),2))
status <- c("Poor","Improved","Excellent","Poor")
patientdata <- data.frame(patientID,age,diabetes,status)
patientdata
#数据框元素的选取
patientdata[1:2]  #选取第一二列数据
# 用$符号提取数据
patientdata$patientID
patientdata[c("diabetes","status")]  #列名字符串提取数据
women
lm(height~weight,data=women)     #构建线性模型
### attach detach with 函数
str(patientdata)   #查看数据结构

因子

function (x = character(), levels, labels = levels, exclude = NA, 
    ordered = is.ordered(x), nmax = NA) 
#因子,在R中名义行变量与有序性变量称为因子,factor。这些分类变量的可能值称为一个水平,level,例如good,better,best。由这些水平值构成的向量称为因子。
diabetes <- factor(diabetes)   #因子的生成  因子是向量
status <- factor(status,ordered = T) #有序性因子的生成
patientdata<-data.frame(patientID,age,diabetes,status)
str(patientdata)
summary(patientdata) #显示连续型变量的最大小值,均值,四分位数,显示分类变量的频数值。
table(patientdata$diabetes)   #对因子型向量进行频次统计
week <- factor(c("Mon","Tus","Wen","For","Fri"),ordered = T,levels =c("Mon","Tus","Wen","For","Fri") )  #参数ordered 按照等级排序,levels 划分等级
week
plot(patientdata$diabetes)  #因子画出的图为直方图 ,分类变量,按照类别统计相应频数
state.region
class(state.region)  #factor
plot(state.region)

缺失值 NA

1+NA  #[1] NA
NA==0  #[1] NA
# 缺失值会被保留和传送
a <- c(NA,1:30)
a
sum(a) #[1] NA
mean(a,na.rm=T)  #[1] 465   #去掉缺失值,并不纳入计算
b <- c(1:30)
mean(b)
is.na(a)  #进行缺失值NA逻辑测试
# na.omit()   去除缺失值
#用于数据框,可以去除包含缺失值的行

#### 处理缺失值的包
#删除缺失值  #行删除  omit.na()  配对删除法
# 最大似然估计 mvmle包
# 插补缺失值    单个插补  Hmisc包   多重插补  Mi包,Mice包,amelia包
# mitools包

# 缺失数据NaN,代表不可能的值   
# Inf无穷, 存在

字符串

nchar("hello world")  #统计字符串的长度
month.name
length(month.name)  #统计向量中字符串的个数
nchar(month.name)  #统计每个字符串的长度
nchar(c(12,2,342))  #将数值型向量中的元素按照字符串统计长度
paste(c("ecerybody","loves","stats")) #[1] "ecerybody" "loves"     "stats"    
 #将向量中的字符串连接起来成为一个字符串
paste("ecerybody","loves","stats")  #[1] "ecerybody loves stats"
paste("ecerybody","loves","stats",sep ="_")  #sep参数 分隔符
paste0("ecerybody","loves","stats")  #中间没有空隙的连接
names <- c("jake","mark","lory")
paste(names,"loves stats")  #names中的元素分别与loves stats相连接
temp<-substr(month.name,start = 1,stop = 4)  #从字符串向量中提取子字符串向量
toupper("temp")   #大写转换
tolower("teEmp")  #小写转换
?sub  #首字母替换
?gsub  #全部匹配替换  ##需要学习正则表达式
gsub("^(\\w)","\\U\\1",tolower(temp))   #每个字符串首位加了一个大写的U
gsub("^(\\w)","\\U\\1",tolower(temp),perl = T)   #替换首字母大写
  # ^ 匹配一行的开头位置    \w匹配任意字符  () 限定多选结构的范围
# \1  \2  匹配第一个    \U 大写
x <- c("b","A+","AC")
grep("A+",x,fixed = T)   #抓取x中包含A+的位置信息
grep("A",x,fixed = F)  #抓取x中包含A的位置信息,+号表示之后的无穷任意字符
match()   #与grep类似
args(strsplit)
function (x, split, fixed = FALSE, perl = FALSE, useBytes = FALSE) 
NULL
strsplit("/usr/local/bin/R","/")
#字符串分割函数   按照"/"对字符串进行分割
class(strsplit("/usr/local/bin/R","/")) # "list"  输出值为list类型
# stringr包
?stringr
help(package="stringr")  #查看stringr包的帮助文档

日期与时间

##时间序列数据  survival   timeseries包
class(presidents)  #[1] "ts"  time series
airmiles  #时间序列
# Time Series:
# Start = 1937 
# End = 1960 
# Frequency = 1 
#  [1]   412   480   683  1052  1385  1418  1634  2178  3362  5948  6109
# [12]  5981  6753  8003 10566 12528 14760 16769 19819 22362 25340 25343
# [23] 29269 30514
Sys.Date()  #查看当前系统的时间
class(Sys.Date())  #[1] "Date"
a <- "2017/07/02"
a <- as.Date(a)  #将a从字符串转换为Date类型数据
a
class(a)  #[1] "Date" 

读取文件

args(read.table)
function (file, header = FALSE, sep = "", quote = "\"'", 
    dec = ".", numerals = c("allow.loss", "warn.loss", 
        "no.loss"), row.names, col.names, as.is = !stringsAsFactors, 
    na.strings = "NA", colClasses = NA, nrows = -1, skip = 0, 
    check.names = TRUE, fill = !blank.lines.skip, strip.white = FALSE, 
    blank.lines.skip = TRUE, comment.char = "#", allowEscapes = FALSE, 
    flush = FALSE, stringsAsFactors = FALSE, fileEncoding = "", 
    encoding = "unknown", text, skipNul = FALSE) 
head()   #读取前6行
tail()   #读取后6行
library(Hmisc)
spss.get()    #导入spss数据
library(foreign)
read.dta()   #读入stata软件数据
# foreign 包 读取各种文件
x <- read.table("clipboard",header = T,sep = ",")  #读取剪切板上的文件
readClipboard()   #读取剪切板信息
read.table()   #直接读取压缩文件
readlines()  #读取不标准的数据 

写入文件

cat()   #直接将结果显示到屏幕上
?write   #写入文件的一系列函数
# append参数 表示追加文件
# 压缩函数 gzfile(“.gz”)
saveRDS()  #保存为Rdata文件
readRDS()   #读取R文件
load()   #加载文件

数据类型转换

methods(is)  #查看is函数
args(subset)
?subset
subset(airquality, Temp > 80, select = c(Ozone, Temp))  #输入数据类型为向量,矩阵或者数据框
#参数 x 对象   subset 逻辑判断表达式   select 包含从一个数据框中选择的列
?sample  #随机抽样  replace参数,控制放不放回抽样
x <- 1:100
x<-sample(x,40,replace = T)
x
x<-sample(x,40,replace = F)   #不放回随机抽样,排序后有重复
x<-sort(x)    #排序用order或者sort函数
mtcars
mtcars[-c(1:5),]  #删除一到五行的数据
#数据框合并
cbind(UScitiesD,)  #按照列合并
data1<-head(USArrests,20)
data2 <- tail(USArrests,20)
rbind(data1,data2)     #按照行合并  !!! 要有相同的列数
data2[duplicated(data2),]  #取出重复的部分
unique(data2)  #去除重复的部分

#### 数据框的翻转
sractm<-t(mtcars)  #行列翻转
sractm
?rev
letters
rev(letters)  #反转元素
women
rownames(women)
rev(rownames(women))  #翻转行名
women[rev(rownames(women)), ]  #使用反转的行名索引,提取数据
transform(women,cm=height*2.54)   #对数据框的列进行修改或增加 。
sort(rivers)  #排序为从小到大  ,只能用于向量,不能用于数据框
mtcars[sort(rownames(mtcars)),]  #对每一行数据排序后索引
?order   #函数返回的是位置信息
sort(rivers)
order(rivers)
rivers[8]
order(mtcars$mpg)
mtcars[order(mtcars$mpg),]
?rank   #秩次排序
WorldPhones
class(WorldPhones)#  "matrix" "array" 
worldPhones<-as.data.frame(WorldPhones)
rs<- rowSums(worldPhones)
cm <- colMeans(worldPhones)
total <- cbind(worldPhones,total=rs)
total
rbind(total,mean=cm)
worldPhones
?apply  #输入  数据框或者矩阵
apply(WorldPhones,1,FUN = sum)
apply(WorldPhones,2,FUN = mean) 
?lapply   #返回值为list   sapply  返回值为向量或者矩阵
state.center
lapply(state.center,FUN = length)  #每个集合中50个值
sapply(state.center,FUN = length)
sapply(state.center,FUN = length)  #返回值为向量
?tapply
state.division
state.name
tapply(state.name,state.division,FUN = length)   #每个州有多少个州的名字

数据的中心化与标准化处理

数据中心化,是指数据集中的各项数据减去数据集的均值。 x-的平均值
数据标准化,是指在中心化之后再除以数据集的标准差,即数据集中的各项数据减去数据集的均值再除以数据集的标准差。Z-score=x-均值/标准差
 归一化:1)把数据变成(0,1)或者(1,1)之间的小数。
 (1)Min-Max Normalization
   x' = (x - X_min) / (X_max - X_min)
   (2)平均归一化
   x' = (x - μ) / (MaxValue - MinValue)
   (3)非线性归一化
  1)对数函数转换:y = log10(x)
  2)反余切函数转换:y = atan(x) * 2 / π
  (3)经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。
目的:对数据中心化和标准化的目的是消除特征之间的差异性,可以使得不同的特征具有相同的尺度,让不同特征对参数的影响程度一致。通过中心化和标准化处理,得到均值为0,标准差为1的服从标准正态分布的数据。
归一化和标准化的区别:归一化是将样本的特征值转换到同一量纲下把数据映射到[0,1]或者[-1, 1]区间内,仅由变量的极值决定,因区间放缩法是归一化的一种。标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,转换为标准正态分布,和整体样本分布相关,每个样本点都能对标准化产生影响。它们的相同点在于都能取消由于量纲不同引起的误差;都是一种线性变换,都是对向量X按照比例压缩再进行平移。
在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score standardization)表现更好。
2)KNN
  需要度量距离的模型,一般在特征值差距较大时,都会进行归一化/标准化。不然会出现“大数吃小数”
  4 什么时候用归一化?什么时候用标准化?
  (1)如果对输出结果范围有要求,用归一化。
  (2)如果数据较为稳定,不存在极端的最大最小值,用归一化。
  (3)如果数据存在异常值和较多噪音,用标准化,可以间接通过中心化避免异常值和极端值的影响。

state.x77
heatmap(state.x77)
#中心化
x <- c(1,2,3,6,3)
mean(x)
x-mean(x)   #[1] -2 -1  0  3  0
sd(x)   #[1] 1.870829   求取标准差的函数
{x-mean(x)}/sd(x)  #标准化
?scale
args(scale)
# function (x, center = TRUE, scale = TRUE)   center=T,中心化处理,sacle=T,标准化处理
{x-min(x)}/(max(x)-min(x))  # 0.0 0.2 0.4 1.0 0.4   归一化 
上一篇下一篇

猜你喜欢

热点阅读