R语言基础学习(一)
分享一下之前的笔记,顺带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 归一化