R语言的基础知识

文章目录

R语言基本操作

设定工作目录

1,设定工作目录
getwd()   #查看当前工作目录
setwd("C:/Users/86133/Desktop/RData")        #设置当前工作目录    
dir()     #查看当前目录下的文件

变量的赋值

> x <- 4
> x
[1] 4

查看变量情况

> ls()   #查看当前的变量信息
[1] "x"
> ls.str()  #查看当前变量以及变量的具体内容
x :  num 4
> str(x)  #查看指定变量值
 num 4

删除变量

> rm(x)   #删除变量
> rm(y,z)   #删除多个变量
> rm(list = ls())   #删除所有变量

查看之前的操作记录

> history()  #查看所有记录

保存文件

> save.image()   #保存当前的操作文档
> q()    #退出编辑

R包的安装

联网在线安装

> install.packages()   #导入所有的包用鼠标进行选择性的R包导入
>  install.packages("vcd")    #直接指定R包进行导入
> .libPaths()    #显示所有的R包库所在的位置
>  library()    #显示所有的已经安装了的R包
>  install.packages(c("ARE","ca"))   #一次性安装多个包
>  update.packages()      #更新安装的R包

R包的使用

> help(package = "vcd")   #查看指定R包的帮助文档
> library(help = "vcd")    #显示包的基本信息
> ls("package:vcd")  #列出包中包含的函数
> data(package = "vcd")  #显示包中所有的数据集
> detach("package:vcd")   #移除加载了的包
>  require(vcd)   #加载要使用的R包
>  remove.packages("vcd")    #删除已安装了的包(从硬盘上彻底删除无法进行使用)

获取帮助

> help.start()   #R语言总的帮助文档
> help("sum")    #查看函数用法    =   > ?sum
> args(sum)   #查函数参数,不想看文档的话
> example("mean")      #查询函数示例代码进行学习
> demo (graphics)   #可以列出很多用R绘制出来的图
> help(package=vcd)  #查看R安装的某个包的帮助文档
> ??gplot  #查询函数帮助文档,不加载包也可以
>  ??heatmap  #本地的模糊搜索,模糊匹配

内置数据集

> help(package="datasets")  #内置数据集存在这个包中
> data()    #访问数据集
>  rivers   #直接输出数据集的名字就能使用数据集(数据集的名字都是内置的)
>  help("mtcars")   #查看数据集的具体信息
> names(euro)  #输出向量的属性信息

> state <- data.frame(state.name,state.abb,state.area,state.division,state.region)  #使用data.frame函数将数据构成数据框(因子)

> heatmap(volcano)    #画热力图

#有些R包也有很多数据集
> data(package = "MASS")  #查看这个R包有哪些数据集可用
>  data(package = .packages(all.available = TRUE))   #显示所有R包的可用数据集

#不想加载R包但是想包的使用其中数据集

> data(Chile,package="car")   

数据结构

R中数据类型

1,数值型,数值可以用于直接计算,加减乘除
2,字符串型,可以进行连接,转换,提取
3,逻辑型,真或者假
4,日期型

向量

向量:一维数组(存储数值型,字符型,逻辑型);是构成其他数据结构的基础,类似于集合,由一个或者多个元素构成
用函数 c 来创建向量(collect)
向量 数据都为同一类型,不能混合类型

#向量数据集
euro #欧元汇率,长度为11,每个元素都有命名
landmasses #48个陆地的面积,每个都有命名
precip #长度为70的命名向量
rivers #北美141条河流长度
state.abb #美国50个州的双字母缩写
state.area #美国50个州的面积
state.name #美国50个州的全称

#定义向量
> x<- c(1,2,3,4,5)
> y <- c("one","two","three")
> z <- c(TRUE,T,F)

#等差序列
> seq(from=1,to=100,by=2)    #设置输出范围以及控制步长
> seq(from=1,to=100,length.out = 10)  #控制输出的等差数列的长度(步长自动调节变大)

#重复元素
> ?rep
> rep(2,5)  #将2重复5次输出--5个2
> rep(x,5)  #将x重复5次
> rep(x,each=5)  #each 将每个元素分类输出
> rep(x,each=5,times=2)   #每个元素重复次数为  each*times

#向量中只有一个元素,可以不加c函数,直接赋值
> a = 2    #一个值,又叫标量
> b = 3
> c = "Hello,Word"
> d = TRUE
> a;b;c;d

#向量化编程,计算非常方便
> x <- c(1,2,3,4,5)   #两个向量(两个集合)
> y <- c(6,7,8,9,10)
> x*2 + y   #避免使用循环,向量化编程
> x[x>3]   #x中取出大于3的值

> rep(x,c(2,4,6,1,3))   #分别控制x向量中每个元素重复的个数
 [1] 1 1 2 2 2 2 3 3 3 3 3 3 4 5 5 5

向量索引

1,正(负)整数索引
2,逻辑向量索引
3,名称索引

> x <- c(1:100)
> length(x)   #统计向量个数
> x[1]   #向量的下表从1开始
> x[-19]  #负数,输出除了19这个数的其他所有元素

> x[c(4:18)]   # 索引使用向量,一次访问多个元素;输出对应索引位置范围的元素
> x[c(1,23,45,67,89)]
> x[c(-2,-3,4)]                #不能有正有负,逻辑错误

##用逻辑值进行索引-- #索引中输逻辑值
> y <- c(1:10)
> y[c(T,F,T,T,F,T)]   #只把逻辑为真的数输出来,循环次序判断
> y[c(T)]  #全输出
> y[c(F)]   #无输出
> y[c(T,F)]  #输出全为奇数
> y[c(T,F,T,T)]   #进行这种判断的循环判断
> y[c(T,F,T,T,T,F,T,T,T,T)]  
> y[c(T,F,T,T,T,F,T,T,T,T,F,T,T)]  #有判断,没元素,产生缺失值。超出了元素个数为NA
 [1]  1  3  4  5  7  8  9 10 NA NA

> y[y>5]  #给出条件判断表达式
> y[y>5&y<9]  #列表里面写逻辑表达式

##字符串向量
> "one" %in% z    #元素是否在向量中
> z["one" %in% z]        #逻辑条件添加到索引中.索引为T,全输出
[1] "one"   "two"   "three" "four"  "five" 

> z[z %in% c("one","two")]  #判断是否在数组中,输出为T的元素
[1] "one" "two"
> z %in% c("one","two")   #只输出TRUE的元素
> k <- z %in% c("one","two")
> z[k]
[1] "one" "two"


##使用names为向量元素添加名称
> names(y)
NULL
> names(y) <- c("one","two","three","four","fiv","six","seven","eight","nine","ten")
> y
  one   two three  four   fiv   six seven eight  nine   ten 
    1     2     3     4     5     6     7     8     9    10 
> y["one"]     #通过每个元素的names访问元素值
one

## 修改向量(添加数据,删除数据,修改数据)
======================================================================================
1,增加向量
> x[101] <- 101   #增加一个数据
> x 

> v <- 1:3

> v[c(4,5,6)] <- c(4,5,6)   #根据索引增加多个元素
> v
[1] 1 2 3 4 5 6

> v[20] <- 4   #下标扩大,中间有很多空值
> v
 [1]  1  2  3  4  5  6 NA NA NA NA NA NA NA NA NA NA NA NA NA  4

> append(x=v,values = 99,after = 5)   #指定位置添加向量(从第5个元素后面添加)
 [1]  1  2  3  4  5 99  6 NA NA NA NA NA NA NA NA NA NA NA NA NA  4
> append(x=v,values = 99,after = 0)    #插入头部
 [1] 99  1  2  3  4  5  6 NA NA NA NA NA NA NA NA NA NA NA NA NA  4
-------------------------------------------------------------------------------------------------------------------------------------------------------
# 删除向量
> rm(v)   			#rm,删除整个向量
> y <- y[-c(1:3)]    #删除向量中的某个元素-c
> y["four"] <- 100  #修改向量中某个元素的值

向量运算

## 向量加法
> x <- 1:10
> x+1    #每一个元素的加减
======================================================================================
##向量与向量的运算   (对应元乘除)
> x
> y <- seq(1,100,length.out=10)  #等差数列,seq
> x+y     
> x*y
> x**y
> y%%x   #取余运算
> y%/%x   #整除运算

 > z<-c(1,2)  #x向量与z向量长度不相等
> x
 [1]  2  3  4  5  6  7  8  9 10 11
> x+z     #循环进行运算,依次+1,+2,+1,+2,+1,+2(长的向量个数必须是短的向量个数的整数倍关系才满足循环运算)
 [1]  3  5  5  7  7  9  9 11 11 13
> z
[1] 1 2
======================================================================================
##向量的逻辑运算<,>(每种运算都可以返回逻辑值)
> x>5
 [1] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
> x
 [1]  2  3  4  5  6  7  8  9 10 11
> y
 [1]   1  12  23  34  45  56  67  78  89 100
 
> x>y    #一一比对,返回T,F
 [1]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 
> c(1,2,3) %in% c(1,2,3,4,5,6)    #存在就判断输出,否则跳过
[1] TRUE TRUE TRUE

> x==y     # ==判断
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

======================================================================================
#向量运算的函数(数学函数,统计函数)
--------------------------------------------------------------------------------------------------------------------------------------------------
 #数学函数
 > x <- -5:5

> x
 [1] -5 -4 -3 -2 -1  0  1  2  3  4  5
> abs(x)  #返回向量的绝对值
> sqrt(5)   #计算平方根
> log(16,base=2)
> log(16)  #不加base参数,默认是自然对数
> log10(10)  #以10为底的对数,log10
> exp(x)   #计算向量中每个元素的指数
> ceiling(c(-2.3,3.1415))  #返回返回不小于x的最小整数
[1] -2  4
> floor(c(-2.3,3.468))   #floor返回不大于x的整数
[1] -3  3
> trunc(c(-2.3,3.468))   #trunc返回整数部分
[1] -2  3
> round(c(-2.3,3.1425),digits = 2)   #round进行向量的四舍五入;向量+保存位数
[1] -2.30  3.14
> signif(c(-2.3,3.1425),digits = 2)   #保留有效数字
[1] -2.3  3.1
> sin(x)  #三角函数...
> cos(x)
-----------------------------------------------------------------------------------------------------------------------------------------
#统计函数
> vec <- 1:100
> sum(vec)
> max(vec)
> min(vec)
> range(vec)   #输出范围
> mean(vec)  #返回平均数
> var(vec)  #返回方差
> round(var(vec),digits = 2)  #设置保留两位小数
> round(sd(vec),digits = 2)  #sd设置向量的标准差sd
> prod(vec)  #向量的连乘的积
> median(vec)  #计算中位数

> quantile(vec)   #计算分位数
    0%    25%    50%    75%   100% 
  1.00  25.75  50.50  75.25 100.00 
> quantile(vec,c(0.4,0.5,0.8))   #根据数组指定分位数
 40%  50%  80% 
40.6 50.5 80.2 

> t <- c(1,4,2,5,7,9,6)
> which.max(t)  #返回值的索引值
> which.min(t)  #返回值的索引值
> which(t==7)  #返回值的索引值
> which(t>5)  #返回值的索引值
[1] 5 6 7
> t[which(t>5)]  #根据返回的索引进行输出对应的值
[1] 7 9 6

矩阵与数组

矩阵:
是二维的,需要有行和列;
R中,矩阵是有维数的向量,矩阵的每个元素必须都拥有相同的模式,和向量一致
矩阵就是给向量加一个维度

#矩阵的数据集
矩阵、数组
euro.cross #11种货币的汇率矩阵
freeny.x #每个季度影响收入四个因素的记录
state.x77 #美国50个州的八个指标
USPersonalExpenditure #5个年份在5个消费方向的数据
VADeaths #1940年弗吉尼亚州死亡率(每千人)
volcano #某火山区的地理信息(10米×10米的网格)
WorldPhones #8个区域在7个年份的电话总数
iris3 #3种鸢尾花形态数据
Titanic #泰坦尼克乘员统计
UCBAdmissions #伯克利分校1973年院系、录取和性别的频数
crimtab #3000个男性罪犯左手中指长度和身高关系
HairEyeColor #592人头发颜色、眼睛颜色和性别的频数
occupationalStatus #英国男性父子职业联系

矩阵

#矩阵的基本用法
> heatmap(state.x77)    #对矩阵数据画热力图
> x <- 1:20
> m <- matrix(x,nrow = 4,ncol = 5)   #根据x向量,设置4行5列的矩阵
> m <- matrix(1:20,4,5)  #根据向量设置4行5列的矩阵
> m <- matrix(x,nrow = 4)  #参数只给一个,会自动分配
> m <- matrix(x,nrow = 4,byrow = T)  #设置参数,规定按行还是按列进行分配.默认按列
> m <- matrix(x,nrow = 4,byrow = F)  #设置参数,规定按行还是按列进行分配.默认按列

#通过列表,设置矩阵的属性名
> rnames <- c("R1","R2","R3","R4")
> cnames <- c("C1","C2","C3","C4","C5")
> dimnames(m) <- list(rnames,cnames)    #dim给m向量设置维数,通过list转为矩阵
> m
   C1 C2 C3 C4 C5
R1  1  5  9 13 17
R2  2  6 10 14 18
R3  3  7 11 15 19
R4  4  8 12 16 20

> ?dim()
> dim(x)  #显示向量的维数
NULL
> dim(x) <- c(4,5)  #为向量x添加维数4行5列
> x
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    9   13   17
[2,]    2    6   10   14   18
[3,]    3    7   11   15   19
[4,]    4    8   12   16   20

数组

===================================================================================
#数组
向量就像数组,多维数组就是矩阵

#数组用法
> x <- 1:20
>  dim(x) <- c(2,2,5)   #长宽高为2,2,5的长方体

#用array创建数组
> > ?array
> dim1 <- c("A1","A2")    #创建标签向量
> dim2 <- c("B1","B2","B3")
> dim3 <- c("C1","C2","C3","C4")
> z <- array(1:24,c(2,3,4),dimnames = list(dim1,dim2,dim3))   #array创建数组,向量+平分向量个数的维数+向量标签名

> Titanic   #R数据集中的内置数组

矩阵的索引

================================================================================
#矩阵的索引(访问,删除,修改数据)
#矩阵下标进行访问
> m <- matrix(1:20,4,5,byrow = T)
> m[1,2]  #访问第一行,第二列的元素2
> m[1,c(2,3,4)]  #一次访问多个元素(第一行,2,3,4列的元素)
> m[c(2:4),c(2,3)]  #输出矩阵的子集
     [,1] [,2]
[1,]    7    8
[2,]   12   13
[3,]   17   18

> m[2,]  #访问第二列
> m[,2]  #访问第二行
> m[2]  #访问行数据,根据索引访问
> m[-1,2]  #去除第一行,取第二列
> dimnames(m) = list(rnames,cnames)  #给m增加维度,并增加行列名
> m["R1","C2"]  #根据标签名进行访问元素,唯一值
-------------------------------------------------------------------------------------------------------

矩阵的运算

> m+1   #每个元素加1,矩阵与矩阵得运需要行和列一致

#矩阵的数学函数

> n <- matrix(1:20,5,4)
> colSums(m)   #计算矩阵每一列的和
> rowSums(m)  #计算矩阵每一行的和 
> colMeans(m)  #计算列的平均值
> rowMeans(m)  #计算行的平均值

> n <- matrix(1:9,3,3)  #创建一个3行3列的矩阵,值为1-9
> t <- matrix(2:10,3,3)  #创建一个3行3列的矩阵
> n*t  #矩阵对应位置元素相乘--内积
> n %*% t  #矩阵的外积
> diag(n)  #返回矩阵对角线位置的值
> t(m)  #t对矩阵进行转置,将行和列进行互换

列表

列表:
用来存储很多内容的集合
是一些对象的有序集合。
列表中可以存储若干向量,矩阵,数据框,甚至其它列表的组合 混合的数据结构

列表数据集:
state.center #美国50个州中心的经度和纬度

##列表的创建
> a <- 1:20 #向量
> b <- matrix(1:20,4)  #矩阵
> c <- mtcars
> d <- "This is a test list"  #标量
> a;b;c;d

>  mlist <- list(a,b,c,d)   #创建一个列表
>mlist <- list(first=a,second=b,third=c,forth=d)  #为每个对象添加名称


##列表的访问
> mlist[1]  #访问列表的第一个元素(访问第一列)$first
> mlist[c(1,4)]  #一次访问多个元素,用向量

> state.center[c("x","y")]   #使用名称进行访问
> mlist$third    #用$符进行高效访问列表

>mlist[1]  #输出的是列表的一个子集,仍然是一个列表【】
> mlist[[1]]   #输出的是元素本身的数据类型integer【】【】 两个[],输出一个元素,可以采用矩阵方式进行元素的访问

##列表的赋值
> mlist[[5]]<-iris   #列表对列表赋值不成立,需要进行两个【】,成为向量去赋值

##删除列表中的元素

> mlist[-5]        #采用负索引,然后再赋值给原来的列表
>  mlist[5] <- NULL        #将原来的要删除的列表元素赋值为NULL

数据框

数据框:
表格式的数据结构
数据集是矩形数组,行表示观测,列表示变量
本质是列表,列表中的元素是向量,成为列,每列相同长度
数据框是矩形结构,列必须命名
每列同一类型,每一行可以不同

#数据框的数据集
数据框
airquality #纽约1973年5-9月每日空气质量
anscombe #四组x-y数据,虽有相似的统计量,但实际数据差别较大
attenu #多个观测站对加利福尼亚23次地震的观测数据
attitude #30个部门在七个方面的调查结果,调查结果是同一部门35个职员赞成的百分比
beaver1 #一只海狸每10分钟的体温数据,共114条数据
beaver2 #另一只海狸每10分钟的体温数据,共100条数据
BOD #随水质的提高,生化反应对氧的需求(mg/l)随时间(天)的变化
cars #1920年代汽车速度对刹车距离的影响
chickwts #不同饮食种类对小鸡生长速度的影响
esoph #法国的一个食管癌病例对照研究
faithful #一个间歇泉的爆发时间和持续时间
Formaldehyde #两种方法测定甲醛浓度时分光光度计的读数
Freeny #每季度收入和其他四因素的记录
dating from #配对的病例对照数据,用于条件logistic回归
InsectSprays #使用不同杀虫剂时昆虫数目
iris #3种鸢尾花形态数据
LifeCycleSavings #50个国家的存款率
longley #强共线性的宏观经济数据
morley #光速测量试验数据
mtcars #32辆汽车在11个指标上的数据
OrchardSprays #使用拉丁方设计研究不同喷雾剂对蜜蜂的影响
PlantGrowth #三种处理方式对植物产量的影响
pressure #温度和气压
Puromycin #两种细胞中辅因子浓度对酶促反应的影响
quakes #1000次地震观测数据(震级>4)
randu #在VMS1.5中使用FORTRAN中的RANDU三个一组生成随机数字,共400组。
#该随机数字有问题。在VMS2.0以上版本已修复。
rock #48块石头的形态数据
sleep #两药物的催眠效果
stackloss #化工厂将氨转为硝酸的数据
swiss #瑞士生育率和社会经济指标
ToothGrowth #VC剂量和摄入方式对豚鼠牙齿的影响
trees #树木形态指标
USArrests #美国50个州的四个犯罪率指标
USJudgeRatings #43名律师的12个评价指标
warpbreaks #织布机异常数据
women #15名女性的身高和体重

##数据框的创建
> ?data.frame  #可以使用data.frame创建数据框
> state <- data.frame(state.name,state.abb,state.region,state.x77)  #数据合并成为数据框. 将数据存储到R进行分析,每列内容存储成向量,再利用dataframe进行合并

##数据框的访问
======================================================================================
#通过索引来访问数据

> state[1]   #输出数据框的第一列
> state[c(2,4)]   #里面可以是数组,输出第二列和第四列
> state[-c(2,4)]      #添加负索引就是去掉这部分内容
> state[,"state.abb"]     #利用行和列的名字直接取出对应的行和列
>  state["Alabama",]    
> state$state.name      #采用$符的访问方式,快速取出任意一列
---------------------------------------------------------------------------------------------------------------------------------------------
>  plot(women$height,women$weight)    #plot绘制身高和体重散点图
>  lm (weight  ~height,data = women)    #lm进行线性回归,直接给出列名
------------------------------------------------------------------------------------------------------------------------------------------------
> ?attach  #加载数据框到R搜索目录中
> attach(mtcars)     #一次使用数据框的多列数据
> mpg    #直接敲数据框列的名字
--------------------------------------------------------------------------------------------------------------------------------------------------
> rownames(mtcars)   #查看行列的名称
>  colnames(mtcars)
----------------------------------------------------------------------------------------------------------------------------------------------
> detach(mtcars)            # 取消加载数据框到R的搜索目录中
> with(mtcars,{hp})    #with也可实现查看数据框的指定列

因子

变量分类:
1,名义型变量(独立,字符串数据)
2,有序型变量(不同值之间有顺序关系)
3,连续型变量(数值类多)

因子:
名义型变量+有序型变量,factor
分类变量的可能值称为一个水平,level (good,better,best)
因子本身也是一个向量,它是一个集合,里面的元素有分类效果(分类)
整个集合称为因子的数据,不是某个变量,水平

因子的应用:
计算频数
独立性检验
相关性检验
方差分析
主成分分析
因子分析

##因子的基本用法
> table(mtcars$cyl)    #使用table进行频数统计  (这一列可以作为因子类型)
 4  6  8    #分为4,6,8三种类型   level
11  7 14    #对应的数量
------------------------------------------------------------------------------------------------------------------------------------------------
##将向量转换为因子(创建因子  factor)
> f <- factor(c("red","red","green","blue","green","blue","blue"))
> f
[1] red   red   green blue  green blue  blue 
Levels: blue green red
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
#有序型变量作为level
> week  <- factor(c("Mon","Fri","Thu","Wed","Mon","Fri","Sun"))
> week
[1] Mon Fri Thu Wed Mon Fri Sun
Levels: Fri Mon Sun Thu Wed   #输出不规范

> week  <- factor(c("Mon","Fri","Thu","Wed","Mon","Fri","Sun"),ordered = T,levels = c("Mon","Tue","Wed","Thu","Fri","Sat","Sun"))   设置level,排序
> week
[1] Mon Fri Thu Wed Mon Fri Sun
Levels: Mon < Tue < Wed < Thu < Fri < Sat < Sun
-----------------------------------------------------------------------------------------------------------------------------------------------------
#绘图
> plot(mtcars$cyl)   #向量输出散点图
> plot(factor(mtcars$cyl))    #因子输出条形图
------------------------------------------------------------------------------------------------------------------------------------------------------
#连续型变量分为n个因子
> num <- 1:100
> cut(num,c(seq(0,100,10)))
10 Levels: (0,10] (10,20] (20,30] (30,40] (40,50] (50,60] (60,70] (70,80] ... (90,100]

缺失数据的分类

缺失值NA:
存储缺失信息
NA表示没有,不知道是多少,不一定是0

##NA的处理
> a <- c(NA,1:49)
> a
 [1] NA  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
[29] 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
> sum(a)
> [1] NA
> sum(a,na.rm = TRUE)   #na,rm 跳过缺失值.    na.rm
[1] 1225
-------------------------------------------------------------------------------------------------------------------------------------------------------
#测试数据里面是否有NA
> is.na(a)   #测试NA  -TRUE

#去掉缺失值,生成新的没有NA的数据集 na.omit
> ?na.omit
> c <- c(NA,1:20,NA,NA)
> c
 [1] NA  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 NA NA
> d <- na.omit(c)  #去掉缺失值
> d
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

> is.na(d)
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[15] FALSE FALSE FALSE FALSE FALSE FALSE
-------------------------------------------------------------------------------------------------------------------------------------
#不同缺失值
1,NA--有存在的值,不知道是多少
2,NaN--不存在
3,inf 存在,无穷大,表示不可能的值

字符串处理函数

统计字符串长度 nchar()

nchar("hello wd")   #统计字符串长度
month.name   #12个变量的名字(字符串)
nchar(month.name)   #返回每个月份的字符数(返回每个元素的字符串的个数)
length(month.name)   #返回元素的个数

> nchar(c(12,2,345))   #统计数值型,返回每个数值型的长度
[1] 2 1 3

将多个字符串合并为一个字符 paste()

> paste(c("everybody","lovers","states"))   
>  paste("everybody","lovers","states")     #默认使用空格进行字符分割
>   paste("everybody","lovers","states",sep = "-")   #设置分割符
> names <- c("z","x","r")
> paste(names,"love whj")  #分别处理,进行向量的组合

字符的提取 substr()

> substr(x = month.name,start = 1,stop = 3)   #字符串的截取
> temp <- substr(x = month.name,start = 1,stop = 3)
> toupper(temp)   #将所有字符转换为大写
> tolower(temp)  #将所有字符转换为小写

查找字符串 grep() + match()

> x <- c("b","A+","AC")
> grep("A+",x)   #正则匹配原则,23的首字母都有A,返回2,3
> grep("A+",x,fixed = T)   #精准匹配,返回2

> match("A+",x)   #相当于包含于的操作%in%

字符串的分割 strsplit()

> path <- "/user/local/bin/R"
> strsplit(path,"/")   #返回的是列表
> class(strsplit(path,"/")) 
[1] "list"
> strsplit(c(path,path),"/")

生成字符串成对组合的技巧 outer()

> face <- 1:13
> suit <- c("spades","clubs","hearts","diamonds")
>  outer(suit,face,FUN = paste)

日期和时间

1,对时间序列的描述
2,利用前面的结果进行预测

将字符串格式化为data类

> a <- "2017-01-01"
> as.Date(a,format = "%Y-%m-%d")   %将字符串转换为时间序列

创建连续的时间点 seq() as.Date()

 seq(as.Date("2017-01-01"),as.Date("2017-07-05"),by=5)

将R生成时间序列 ts() 将向量转换为时间序列函数

 sales <- round(runif(48,min = 50,max = 100))    #随机生成48个数,最小值~最大值  runif
 ts(sales,start = c(2010,5),end = c(2014,4),frequency = 1)   #时间序列格式(以年为单位的频率变化)

常见错误

1,向量加c (表示集合);标量可用=
2,矩阵matrix;数据框data.frame;
3,字符串有引号,函数有括号;安装R包时候加引号
4,路径问题 /
5,记得载入R包

获取数据

R获取数据的3种途径

1. 利用键盘来输入数据

> a <- c(1,2,3,4)
> b <- c("10/2/3","4/6/8","3/23/1","23/63/2")
> c <- c(2,4,6,7)
> data <-  data.frame(a,b,c)    #创建一个数据框

> datad2 <- data.frame(a=numeric(),b=character(),c=numeric())  #创建数据框的时候指定数据类型
> datad2 <- edit(datad2)   #对数据进行值的可视化编辑 edit(),有返回值需要变量
>  fix(datad2)   #作用同上

3. 通过读取存储在外部文件上的数据

读取纯文本文件

1,读取纯文本文件
> x <- read.table("input.txt")
> head(x)   #查看头,默认6行
> tail(x)   #查看尾,默认6行
> head(x,n=10)   #查看指定的行数n
> y <- read.table("input.csv",sep = ",")
> y <- read.table("input.csv",sep = ",",header = TRUE)   #将表格的第一行设置为表格的列变量header=TRUE
> read.table("input 1.txt",header = TRUE,skip = 5)  #有的文件有注释信息,需要跳过内容
> read.table("input 1.txt",header = TRUE,skip = 5,nrows = 200)   #读取行数nrow

读取网络文件

#1,读取html中的表格
> install.packages("XML")
>readHTMLTable("网址",which=3)  #从网址中读取第几个表格

读取压缩软件

> read.table(gzfile("input.txt.gz"))

读取不标准的数据

> readLines("input.csv",n = 5)   #每次读取一行
> scan("文件",what=list( character(3),numeric(0),muneric(0)   ))   #读取单元值

通过访问数据库系统来获取数据

> install.packages("RODBC")   #加载能够访问数据库的odbc包
>library(RODBC)
> help(package="RODBC")

写入文件

write直接将结果写入文件里面

> x <- rivers
> cat(x)   #将结果显示在屏幕上

> #write直接将结果写入文件里面
> #对象是数据框,write.table
> 对象是csv文件write.csv

> x <- read.table("input.txt",header = TRUE)   #读文件
> write.table(x,file = "C:/Users/86133/Desktop/RData/test.txt")    #写文件
> write.table(x,file = "C:/Users/86133/Desktop/RData/test.csv",sep = ",")   #写文件,会自动编号
> write.table(x,file = "C:/Users/86133/Desktop/RData/test2.csv",sep = ",",row.names = FALSE)  #√ ,不会自动编号,数据格式内容正常

##追加数据到文件中
write.table(iris,file = "C:/Users/86133/Desktop/RData/test2.txt",append = T)   

写成压缩文件

 write.table(mtcars,gzfile("test.csv.gz"))

R中读写Excel文件

1,将excel文件另存为csv/txt文件,使用read函数读取

read.csv("x")

2,使用能够直接读取excel文件的包(RODBC包,XLConnect包)

XLConnect包,支持所有平台,依赖于java,首先需要配置java的运行环境

 install.packages("XLConnect")
 > library(XLConnect)
 
 ## 分两步去读取文件
 1.读取整个工作簿,也就是整个excel文件
 > ex <- loadWorkbook("data.xlsx")
 2,读取具体的工作表的内容
 > edata <- readWorksheet(ex,1)  #1代表工作溥中第一个工作表的内容;读取后直接保存为数据框
 
 #控制读取工作表的范围
 edata <-  readWorksheet(ex,1,startRow = 0,startCol = 0,endRow = 50,endCol = 3)  #第一个单元格开始,读取50行3列数据

将数据写入excel(四步法)

1,创建工作簿
2,创建工作表
3,将数据保存在工作表中
4,将工作簿存为文件

> createSheet(wb,"Sheet 1")
> writeWorksheet(wb,data = mtcars,sheet = "Sheet 1")
> saveWorkbook(wb)
> writeWorksheetToFile("file1.xlsx",data = iris,sheet = "Sheet 1")

读写R格式的文件

存成R文件后只能在R中打开;R会对存储的内部文件格式的数据进行自动压缩处理,也会存储R元数据信息。数据包含因子,日期,时间或者类的属性信息

#存储单个文件RDS格式
> saveRDS(iris,file = "iris.RDS")
> readRDS("iris.RDS")
#存储多个文件成为Rdata文件
> save(iris,iris3,file = "C:/Users/86133/Desktop/RData/iris.Rdata")
> load("C:/Users/86133/Desktop/RData/iris.Rdata")
#保存当前工作蒲的所有对象
> save.image()

数据转换

数据类型转换(一)

> library(xlsx)
> cars32 <- read.xlsx("mtcars.xlsx",sheetIndex=1.header =T)  #读取excel的文件

> is.data.frame(cars32)   #判断是否是数据框形式
>  is.data.frame(as.data.frame(state.x77))  #转换数据为数据框格式  as.data.frame()

>  as.matrix(~)  #转换为矩阵形式
>  as.vector()  #转换为向量
>  as.factor()  #转换为因子
> as.list(x)   #转换为列表
> x <- state.abb
> dim(x) <- c(5,10)  #设置向量维度,

> x <- state.abb
> as.factor(x)   #变成因子类型
> > as.list(x)  #变成列表

> state <- data.frame(x,state.region,state.x77)  #设置数据框
> state$Income   #使用$取出数据框中的任何一列
> state["Nevade",]   #取出行使用名称索引,后面加逗号,前取行后取列   
> unname(y)  #unname()  不需要列名
>  unlist(y)  #转换为向量

数据取子集/抽样/增加数据

对数据取子集-索引

> setwd(dir = "C:/Users/86133/Desktop/RData")
> who <- read.csv("WHO.csv",header = T)   #读取数据框文件
>  who1 <- who[c(1:50),c(1:10)]   #数据框的子集。前50行10列

#利用索引可以提取数据框中的任何内容
> who2 <- who[c(1,3,5,7),c(2,14,18)]   #提取1,3,5,7行,2,14,18列
> who4 <- who[which(who$CountryID >50 & who$CountryID <=100 )]   #使用逻辑进行提取数据

对数据取子集-函数subset

> who5 <- subset(who,who$CountryID >50 & who$CountryID <=100 )

随机抽样sample

> x <- 1:100
> sample(x,30)   #无放回抽样
 > sample(x,60,replace = T)   #有放回抽样,值有重复
> who[sample(who$CountryID,30,replace = F),]      #对数据框进行抽样,取子集

删除固定行的数据

mtcars[,-1,-5]                #`删除列`
mtcars$mpg <- NULL  #将这一列赋值给NULL.,清空这一列数据

为数据框增加行/列 cbind/rbind

> data.frame(USArrests,state.division)   #直接data.frame直接生成新的数据框
> cbind(USArrests,state.division)   #直接cbind/rbind函数,在原数据上进行合并操作.必须有相同的行列名
> unique(data)   #去除重复数据

数据框的翻转/修改值/排序

数据框的翻转t()/rev()

> sractm <- t(mtcars)   #t()函数实现行和列的翻转

#单独一行翻转rev()
> rev(letters)
women[rev(rownames(women)),]

修改数据框中的值transform()

 transform(women,height=height*5)  #每个height值都*5,原数据上进行修改
 > transform(women,cm=height*5)   #使用新的一列进行计算

数据框的排序sort/order
-sort 对向量进行排序,返回排序后的结果向量–只能对向量进行排序> sort(state.name),取相反结果rev()
-order 返回排序后的索引值> order(rivers),可以根据索引返回数据的值> mtcars[order(mtcars$mpg),],取相反的顺序,> mtcars[order(-mtcars$mpg),],对多个条件进行排序mtcars[order(mtcars$mpg,mtcars$disp),]

数据转换(四)

对数据框进行数学计算

> worldphones <-  as.data.frame(WorldPhones)   #将矩阵转换为数据框
> rs <- rowSums(worldphones)   #计算每一行的数据求和
>  cm <- colMeans(worldphones)   #计算每列的平均数
> total <- cbind(worldphones,Total = rs)  #cbind将每行的和添加到最后一列
>  rbind(total,Mean=cm)  #添加列

apply函数–适用数据框和矩阵

apply(WorldPhones, MARGIN = 1, FUN = sum)   #对每一行求和
apply(WorldPhones, MARGIN = 2, FUN = mean)   #对每一列求平均值

lapply函数 --适用列表,返回值是列表lapply(state.center, FUN = length)
sapply 函数 --返回向量值> sapply(state.center, FUN = length)
tapply 函数 --根据因子进行分区计算处理> sapply(state.center, FUN = length)

数据的中心化与标准化(向数据中心靠拢)

数据中心化:数据的各项数据减去数据集的均值
数据标准化:数据中心化的数据再除以数据集的标准差

reshape2包对数据进行格式转换

reshape2进行宽数据转换为长数据

> install.packages("reshape2")
> library(reshape2)

> names(airquality) <- tolower(names(airquality))  #将列名改为小写
> aql <- melt(airquality)   #融合数据,每一行都是变量的组合,将宽数据变为了长数据
> aql <- melt(airquality,id.vars = c("month","day"))  #设置id,其余作为观测值

tidyr包 进行数据转换

tidyr 处理整洁数据
gather好处:让固定列不变,而其他列进行转换

> install.packages(c("tidyr","dplyr"))
> library(tidyr)
> tdata <- mtcars[1:10,1:3]   #截取10行3列数据  

> tdata <- data.frame(names=rownames(tdata),tdata)  #增加一列
> gather(tdata,key = "Key",value = "Value",cyl,disp,mpg)  #指定k,v,以及需要处理的列
> gather(tdata,key = "Key",value = "Value",cyl:disp,mpg)  #:指定哪些列放在同一列中cyl:disp放在了同一列中
> gather(tdata,key = "Key",value = "Value",cyl,-disp)   #添加-,减去不需要转换的列
> gather(tdata,key = "Key",value = "Value",2:4)  #列的名字容易出错,就写列编号

spead 与gather作用相反,转换为tidy格式数据

> gdata <- gather(tdata,key = "Key",value = "Value",2:4)   
> spread(gdata,key = "Key",value = "Value")  #把长数据返回成tidy数据

separate将列进行拆分

 df <- data.frame(x=c(NA,"a.b","a.d","b.c"))
 > separate(df,col = x,into = c("A","B"))  #默认识别分割符
 > df <- data.frame(x=c(NA,"a.b-c","a-d","b-c"))
 > > separate(df,col = x,into = c("A","B"),sep = "-")  #多个分隔符指定分隔符进行拆分

unite将列进行连接

> x <- separate(df,col = x,into = c("A","B"),sep = "-")
> unite(x,col = "AB",A,B,sep = "-")  #连接数据,设置列名与指定连接的列并设置连接符

dplyr包进行数据转换

dplyr对单表格进行操作

> library(dplyr)
> ls("package:dplyr")  #查看包里面的函数
> help(package="dplyr")

> dplyr::filter(iris,Sepal.Length >7)   #过滤操作
> dplyr::distinct(rbind(iris[1:10,],iris[1:15,]))   #取出某些行进行组合构成数据框,并实现去重
> dplyr::slice(iris,10:15)  #切片,取出数据的任意行
> dplyr::sample_n(iris,10)   #随机取样抽出10行
> dplyr::sample_frac(iris,0.1) #按比例进行随机选取
> dplyr::arrange(iris,Sepal.Length)   #按照花的长度进行排序
>  dplyr::arrange(iris,desc(Sepal.Length))   #按照相反的方向进行排序

取子集

> ?select

统计函数

> summarise(iris,avg=mean(Sepal.Length))   #求平均
> summarise(iris,sum=sum(Sepal.Length))   #求和

链式操作符

将一个函数的输出作为另一个函数的输入 ctrl+shift+M %>%

> head(mtcars,20) %>% tail(10)  #输出第11-20行。基本表是前面函数的前20行数据的输入
> dplyr::group_by(iris,Species)   #进行分组
> iris %>% group_by(Species)   #功能同上
> iris %>% group_by(Species) %>% summarise(avg = mean(Sepal.Width))   #分组统计,计算平均值
> iris %>% group_by(Species) %>% summarise(avg = mean(Sepal.Width))  %>%  arrange(avg)  #对分组统计的结果进行排序
> dplyr::mutate(iris,new=Sepal.Length+Petal.Length)  #添加新的一列变量

dplyr对双表格操作

> a <- data.frame(x1=c("A","B","C"),x2 = c(1,2,3))
> b <- data.frame(x1=c("A","B","C"),x3=c(T,F,T))

> dplyr::left_join(a,b,by="x1")   #左连接
>dplyr::right_join(a,b,by="x1")   #右连接
> dplyr::full_join(a,b,by="x1")   #全连接
> dplyr::semi_join(a,b,by="x1")   #半连接,输出交集
> dplyr::anti_join(a,b,by="x1")  #反连接 ,输出补集

运算

 first <- slice(mtcars,1:20)   #取出数据,不包含行名
 > mtcars <- mutate(mtcars,Model=rownames(mtcars))   #设置行名列
 
 > first <- slice(mtcars,1:20)
> second <- slice(mtcars,1:380)
> intersect(first,second)   #取交集
> dplyr::union_all(first,second)  #取并集
> setdiff(first,second)   #取first的补集

R中的函数

数学统计函数

R概率分布函数

> ?Normal
> rnorm(n=100,mean=15,sd=12)   #均值15,方差为2的100个随机数
> round(rnorm(n=100,mean=15,sd=12))  #取整
> runif(50,min = 1,max = 100)   #生成50-100的50个随机数

描述性统计函数

> myvars <- mtcars[c("mpg","hp","wt","am")]  
> summary(myvars)   #对一个数据进行详细统计

频数统计函数

一维

> mtcars$cyl <- as.factor(mtcars$cyl)   #转换为因子
> split(mtcars,mtcars$cyl)   #分组

#cut  对连续数据进行切割
> cut(mtcars$mpg,c(seq(10,50,10)))   #对连续数据进行分割  10-50切成10份
>  table(mtcars$cyl)   #进行频数统计
>  prop.table(table(mtcars$cyl))    #计算频率
> prop.table(table(mtcars$cyl)) *100   #百分比的值

二维数据框的频数统计

> library(vcd)   
> table(Arthritis$Treatment,Arthritis$Improved)   #进行频数统计

独立性检验函数

变量之间是独立的,没有关系

> mytable <- table(Arthritis$Improved,Arthritis$Sex)
> chisq.test(mytable)   #卡方检验。p-value值越小越好、。证明两个变量独立

绘图函数

R语言四大作图系统

  • 基础绘图系统
  • lattice包
  • ggplot2包
  • grid包
> ls("package:graphics")   #基础绘图函数总和
>  help(package="graphics")   #查看帮助文档
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值