文章目录
前言
本学期学习R语言来做数据可视化,记录学习内容方便回顾。
所用软件:R和Rstudio。
另:本人所用电脑为MacBook,涉及按键部分均为MacBook键盘。
持续更新中——
一、基础操作
1.新建文件
点击左上角加号。
2.添加/取消注释
在前面加#或快捷键:command+shift+c。
3.运行程序
运行整段:command+shift+enter
运行单行:command+enter
4.获取/设置工作目录
获取:getwd(),得到当前.R文件的路径
设置:setwd(),设置当前.R文件的路径,括号中要写目标地址
注意:设置时使用单斜杠/
5.赋值
除了=,还可以用->或<-来赋值,箭头指向变量。
6.显示变量
方法一:直接在命令行输入变量名称后按回车;
方法二:使用print()函数。
7.查看/清除变量
·ls():查看所有已经定义的变量,并输出变量名称。
·rm(a):清除名称为a的变量。
·rm(list=ls()):清除所有变量。
8.函数帮助
方法一:输入?+要查询的函数;
方法二:help(函数名称);
方法三:example(函数名称);
会在右下角的框中显示该函数的使用方法。
9.安装R包
使用install.packages()安装,用library()调用。
注意:前者要加双引号,后者不用。
二、函数
1.文件读取
(1)scan函数
scan(file=" ",what=double( ),nmax=-1,n=-1,sep=" ")
- file后填写文件名或路径,不填默认从键盘读取;
- what表示读取的数据类型,如果有多个可以不填;
- nmax表示最大读取数据点数,默认值-1表示读取所有数据点;
- n表示要读取的数据点数,默认值-1表示读取所有数据点(注意n和nmax写一个就可以);
- sep表示数据之间的分隔符,默认为空格。
(2)readline()函数
从键盘中读入数据。
(3)readxlsx()函数
读入.xlsx文件,需要安装r包openxlsx
2.读入数据
(1)键盘输入
> G<-matrix(numeric(0),5,4)
> G<-edit(G)
出现以下框框,修改数据即可。
(2)从CSV文件或.data文件中读入:read.table
mydataframe<-read.table("statistic app/test.csv",sep=",")
data<-read.table("statistic app/iris.data",sep=",")
(3)从EXCEL中读入:read.xlsx
library(openxlsx)
data<-read.xlsx("statistic app/test Excel.xlsx",colNames=FALSE,rowNames=FALSE)
#colNames,rowNames如果为TRUE,则使用第一行和第一列作为行和列的标题
三、语法
1.向量
(1)创建
a<-c(1,2,3,4)
#a为(1,2,3,4)
a<-1:4
#a为(1,2,3,4)
a<-vector(length=4)
a[1]<-1
#a为(1,0,0,0)
(2)索引
a[2]#输出:2
a[c(1,3)]#输出:1 3
a[1:3]#输出:1 2 3
注意:r语言向量中第一个是从1开始标号的!
(3)更改
索引后用<-赋值。
(4)删除
e<-a[-2]
#此时e就是a中删除2的结果1,3,4
注意:删除后要重新赋给一个新变量!
(5)添加
定义一个新变量存放添加后的向量。
> a<-c(5,4,3,2,1)
> a
[1] 5 4 3 2 1
> b<-c(a[1:2],8,a[3:5])
> b
[1] 5 4 8 3 2 1
(6)获取长度
使用length()函数。
> x<-c(2,4,6,8)
> length(x)
[1] 4
(7)判断数据类型
使用class()函数。
> A<-1
> class(A)
[1] "numeric"
> B<-c(1,2,3)
> class(B)
[1] "numeric"#向量的类型和其中元素的类型相同
> C<-"flower"
> class(C)
[1] "character"#字符型加双引号
> D<-TRUE
> class(D)
[1] "logical"
(8)其他常用向量函数
> seq(from=3,to=12,by=3)#从3到12,输出差为3的等差数列
[1] 3 6 9 12
> seq(from=3,to=12,length.out=6)#从3到12,输出6个数且为等差数列
[1] 3.0 4.8 6.6 8.4 10.2 12.0
> rep(c(1,2),time=2)#整个向量重复两次
[1] 1 2 1 2
> rep(c(1,2),each=2)#每个元素重复两次
[1] 1 1 2 2
> y<-c(1,2,3,4,5,6)#cut(y,n)把连续型变量y划分为n个因子
> cut(y,3)
[1] (0.995,2.67] (0.995,2.67] (2.67,4.33] (2.67,4.33] (4.33,6] (4.33,6]
Levels: (0.995,2.67] (2.67,4.33] (4.33,6]
> name<-c("Jane")#连接函数cat
> cat("Hello",name,'\n')
Hello Jane
2.矩阵
(1)创建
> matrix((1:20),nrow=5,ncol=4)#行数和个数固定,可以不用输入列数
[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
> matrix(1:20,nrow=5,ncol=4,byrow=TRUE)#byrow默认为FALSE,改为TRUE则按行排
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
[4,] 13 14 15 16
[5,] 17 18 19 20
> rnames<-c("r1","r2","r3")
> cnames<-c("c1","c2","c3")
> matrix(1:9,nrow=3,ncol=3,dimnames=list(rnames,cnames))#用list给行和列加名称
c1 c2 c3
r1 1 4 7
r2 2 5 8
r3 3 6 9
注:也可以后加名称,用dimnames()函数设置即可,括号中为矩阵名称,所赋的值为list类型。
(2)索引
> M<-matrix(1:6,nrow=3,ncol=2)
> M
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> M[1,2]#第一行第二列
[1] 4
> M[,1]#第1列所有元素
[1] 1 2 3
> M[2,]#第2行所有元素
[1] 2 5
(3)矩阵的合并
> M<-matrix(1,2,3)#表示所有元素均为1
> N<-matrix(2,2,3)#所有元素均为2
> rbind(M,N)#纵向合并,即增加行数
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 1 1 1
[3,] 2 2 2
[4,] 2 2 2
> cbind(M,N)#横向合并,即增加列数
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 1 1 2 2 2
[2,] 1 1 1 2 2 2
(4)矩阵相关数学计算
> colSums(M) #对列求和
[1] 2 2 2
> rowSums(M) #对行求和
[1] 3 3
> colMeans(M) #对列求均值
[1] 1 1 1
> rowMeans(M) #对行求均值
[1] 1 1
> det(M)
> > X<-matrix(1,2,2) #计算行列式(只能对方阵)
> det(X)
[1] 0
> A<-matrix(1:4,nrow=2)
> A
[,1] [,2]
[1,] 1 3
[2,] 2 4
> A+A #对应分量相加
[,1] [,2]
[1,] 2 6
[2,] 4 8
> A%*%A #矩阵相乘
[,1] [,2]
[1,] 7 15
[2,] 10 22
> A*A #对应分量相乘
[,1] [,2]
[1,] 1 9
[2,] 4 16
> diag(c(1,4)) #写成对角矩阵
[,1] [,2]
[1,] 1 0
[2,] 0 4
> diag(diag(A))
[,1] [,2]
[1,] 1 0
[2,] 0 4
> diag(A)#对角元素的向量
[1] 1 4
> c(A)#把矩阵写成向量的形式
[1] 1 2 3 4
> M<-matrix(1:6,nrow=3,ncol=2)
> dim(M)#求M维度
[1] 3 2
> dim(M)[1]#求M
[1] 3
> dim(M)[2]
[1] 2
3.数组
相当于高维矩阵
> array(1:24,c(2,3,4))#2行,3列,4维
, , 1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
, , 2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
, , 3
[,1] [,2] [,3]
[1,] 13 15 17
[2,] 14 16 18
, , 4
[,1] [,2] [,3]
[1,] 19 21 23
[2,] 20 22 24
4.数据框
列向量,每个列向量可以是不同的数据类型
(1)创建
> studentsID<-c(1,2,3)
> score<-c(99,89,93)
> level<-c("S","B","A")
> mydata<-data.frame(studentsID,score,level)
> mydata
studentsID score level
1 1 99 S
2 2 89 B
3 3 93 A
(2)索引
> mydata[2]#可以用列数索引
score
1 99
2 89
3 93
> mydata["level"]#也可以用名称索引
level
1 S
2 B
3 A
> mydata[1,2]#和矩阵一样,表示第一行第二列的元素
[1] 99
> mydata[c(1,2)]#写成向量的形式就是这两列的内容
studentsID score
1 1 99
2 2 89
3 3 93
> mydata[c(1,2),c(2,3)]#前面一个向量是行向量,后面一个向量是列向量
score level
1 99 S
2 89 B
(3)合并
> studentsID<-c(1,2,3)
> score<-c(99,89,93)
> level<-c("excellent","middle","good")
> studentsdata1<-data.frame(studentsID,score,level)
> print(studentsdata1)
studentsID score level
1 1 99 excellent
2 2 89 middle
3 3 93 good
> studentsID<-c(1,2,4)
> report<-c("Yes","No","Yes")
> level<-c("good","middle","good")
> studentsdata2<-data.frame(studentsID,report,level)
> print(studentsdata2)
studentsID report level
1 1 Yes good
2 2 No middle
3 4 Yes good
> merge(studentsdata1,studentsdata2,by="studentsID")
> #显示两个数据框中相同的元素
studentsID score level.x report level.y
1 1 99 excellent Yes good
2 2 89 middle No middle
> merge(studentsdata1,studentsdata2,by="studentsID",all.x=T)
> #显示第一个数据框中所有元素
studentsID score level.x report level.y
1 1 99 excellent Yes good
2 2 89 middle No middle
3 3 93 good <NA> <NA>
> merge(studentsdata1,studentsdata2,by="studentsID",all=T)
> #显示两个数据框中所有元素
studentsID score level.x report level.y
1 1 99 excellent Yes good
2 2 89 middle No middle
3 3 93 good <NA> <NA>
4 4 NA <NA> Yes good
(4)取子集
> studentdata1
studentsID score level
1 1 99 excellent
2 2 89 middle
3 3 93 good
> part1<-studentdata1[,c(2:3)]#提取2到3列
> part1
score level
1 99 excellent
2 89 middle
3 93 good
> part2<-studentdata1[c(1:2),]#提取1到2行
> part2
studentsID score level
1 1 99 excellent
2 2 89 middle
> newpart<-subset(studentdata1,score<95 & score>90,select = c(studentsID,score))
> newpart
studentsID score
3 3 93
subset函数:第一个是数据框名称,第二个是条件,第三个是要保留的内容。
5.列表
其中的元素可以是任何数据结构
> g<-"mylist"
> h<-c(25,27,33,28)
> j<-matrix(1:10,nrow=5)
> k<-c("one","two","three")
> myList<-list(title=g,ages=h,j,k)#等号前面相当于小标题,没有就默认为项目排序
> myList
$title
[1] "mylist"
$ages
[1] 25 27 33 28
[[3]]
[,1] [,2]
[1,] 1 6
[2,] 2 7
[3,] 3 8
[4,] 4 9
[5,] 5 10
[[4]]
[1] "one" "two" "three"
6.因子
因子不是向量
> level<-factor(c("excellent","good","middle","good"))
> summary(level)
excellent good middle
1 2 1
7.缺失值
> y<-c(1,2,NA,4,5)
> is.na(y)
[1] FALSE FALSE TRUE FALSE FALSE
> sum(y,na.rm=TRUE)#增加条件:把缺失值移除
[1] 12
> z<-na.omit(y)
> print(z)
[1] 1 2 4 5
attr(,"na.action")
[1] 3
attr(,"class")
[1] "omit"
> B<-c(1,2,3,4,NA)
> B
[1] 1 2 3 4 NA
> mean(B)
[1] NA
> mean(B,na.rm=TRUE)
[1] 2.5
8.随机抽样
(1)数据的随机抽样
> A<-c(1:20)
> sample(A,5)#默认无放回
[1] 5 12 17 19 11
> sample(A,5,replace=TRUE)#TRUE表示有放回
[1] 17 18 17 16 17
(2)数据框的随机抽样
> studentsID<-c(1,2,3)
> score<-c(99,89,93)
> level<-c("excellent","middle","good")
> studentsdata<-data.frame(studentsID,score,level)
> studentsdata
studentsID score level
1 1 99 excellent
2 2 89 middle
3 3 93 good
> id<-sample(1:nrow(studentsdata),2)#从第一行到最后一行抽样两个
> id
[1] 3 1
(3)随机分布的随机抽样
#随机分布
> x<-pretty(c(-3:3),30)
> y<-dnorm(x)#d:density概率密度
> plot(x,y,type = 'l',xlab="Normal deviate",ylab="Density")
> y<-pnorm(x)#p:distribution function分布函数
> plot(x,y,type = 'l',xlab='Normal deviate',ylab='Distribution')
随机分布补充内容:
- 随机分布的cut函数
> Z<-rnorm(10000)
> table(cut(Z,breaks = -6:6))
(-6,-5] (-5,-4] (-4,-3] (-3,-2] (-2,-1] (-1,0] (0,1] (1,2] (2,3] (3,4]
0 0 11 225 1301 3441 3476 1320 212 14
(4,5] (5,6]
0 0
- 随机分布set.seed函数:使每次set.seed后都是同一组随机数
> set.seed(3)
> rnorm(6)
[1] -0.96193342 -0.29252572 0.25878822 -1.15213189 0.19578283 0.03012394
> rnorm(6)
[1] 0.08541773 1.11661021 -1.21885742 1.26736872 -0.74478160 -1.13121857
> set.seed(3)
> rnorm(6)
[1] -0.96193342 -0.29252572 0.25878822 -1.15213189 0.19578283 0.03012394
- 多元正态分布生成随机数:mvrnorm()
该函数的基本用法:
mvrnorm(n, mean, Sigma, tol = 1e-6, empirical = FALSE, EISPACK = FALSE)
其中各参数的含义如下:
·n:表示要生成的随机向量的个数。
·mean:表示多元正态分布的均值向量。
·Sigma:表示多元正态分布的协方差矩阵(正态对称矩阵)。
·tol:控制数值误差的容差,默认值为1e-6。
·empirical:一个逻辑值,如果为TRUE,则使用数据的经验协方差矩阵。默认值为FALSE。
·EISPACK:一个逻辑值,如果为TRUE,则使用EISPACK库中的算法来计算特征分解。默认值为FALSE。
示例:
> # 设置均值向量和协方差矩阵
> mean_vector <- c(1, 2)
> cov_matrix <- matrix(c(1, 0.5, 0.5, 2), nrow = 2)
>
> # 生成随机向量
> random_vectors <- mvrnorm(n = 1000, mean_vector, Sigma = cov_matrix)
>
> # 打印前几个随机向量
> head(random_vectors)
[,1] [,2]
[1,] 1.0776579 0.87763341
[2,] 0.7370851 2.27497857
[3,] 1.7883022 0.77470247
[4,] 1.1652272 -0.08411565
[5,] 2.2570566 2.40963053
[6,] 1.4947353 4.18532124
9.排序
(1)数的排序
> B<-sample(1:6)
> B
[1] 2 1 3 4 5 6
> order(B)
[1] 2 1 3 4 5 6
> B[order(B)]
[1] 1 2 3 4 5 6
> sort(B)#直接输出从小到达的结果
[1] 1 2 3 4 5 6
(2)数据框的排序
> studentdata1
studentsID score level
1 1 99 excellent
2 2 89 middle
3 3 93 good
> studentdata1[order(studentdata1$score),]#从低到高
studentsID score level
2 2 89 middle
3 3 93 good
1 1 99 excellent
> studentdata1[order(-studentdata1$score),]#从高到低
studentsID score level
1 1 99 excellent
3 3 93 good
2 2 89 middle
9.其他数学公式
(1)复数
> 0+1i#复数的输入格式
[1] 0+1i
(2)求导、求积分
> D(expression(x^3+2*x^2+x+1),"x")#求导
3 * x^2 + 2 * (2 * x) + 1
> integrate(dnorm,-Inf,Inf)#求积分
1 with absolute error < 9.4e-05
(3)计算函数
> f = function(x){return (x*(10-x))}
(4)求最值(maximum为TRUE求最大,反之求最小)
> optimize(f,interval = c(0:10),maximum = TRUE)
$maximum#取最大值时的取值
[1] 5
$objective#最大值
10.字符型函数
- 计算字符个数
> x<-c("ab","cd","efg")
> nchar(x)
[1] 2 2 3
- 取子字符串
> x<-"abcdefg"
> substr(x,3,5)#表示从第三个字符取到第五个字符
[1] "cde"
- 查找指定模式的字符串
11.Apply函数
在R语言中,apply()函数是一种常用的函数,用于对矩阵或数组的行或列进行操作。它的主要作用是在数据集的维度上应用函数。apply()函数的语法如下:
apply(X, MARGIN, FUN, ...)
其中:
·X是一个矩阵或数组。
·MARGIN是一个整数向量,表示在哪个维度上应用函数。如果MARGIN为1,则在行上应用函数;如果为2,则在列上应用函数;如果为c(1, 2),则在行和列上分别应用函数。
·FUN是要应用的函数。
·…是传递给FUN的其他参数。
apply()函数的工作原理是将指定维度上的元素取出来形成一个向量,然后将这个向量作为参数传递给FUN函数。FUN函数可以是任何R中的函数,也可以是用户自定义的函数。
下面是apply()函数的一些常见用法:
- 对矩阵的行或列进行求和、平均、方差等统计操作:
> A<-matrix(1:12,3,4)
> A
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> apply(A,1,sum)#对行求和
[1] 22 26 30
> apply(A,2,sum)#对列求和
[1] 6 15 24 33
- 对数组的某个维度进行操作:
> score1<-c(99,89,94)
> score2<-c(87,78,82)
> students<-data.frame(score1,score2)
> students
score1 score2
1 99 87
2 89 78
3 94 82
> apply(students,2,mean)
score1 score2
94.00000 82.33333
关于apply函数的练习:
1.创建该数据框
> ID<-1:10
> Course1<-c("Excellent","Good","Excellent","Excellent","Good","Excellent","Good","Excellent","Excellent","Good")
> score<-matrix(round(rnorm(40,85,5)),10,4)
> Course2<-score[,1]
> Course3<-score[,2]
> Course4<-score[,3]
> Course5<-score[,4]
> studentdata<-data.frame(ID,Course1,Course2,Course3,Course4,Course5)
> studentdata
ID Course1 Course2 Course3 Course4 Course5
1 1 Excellent 79 85 83 92
2 2 Good 80 89 82 80
3 3 Excellent 84 92 89 88
4 4 Excellent 90 96 86 76
5 5 Good 79 79 84 88
6 6 Excellent 85 82 90 82
7 7 Good 90 77 82 87
8 8 Excellent 79 71 82 91
9 9 Excellent 90 83 77 91
10 10 Good 90 90 82 85
score<-matrix(round(rnorm(40,85,5)),10,4)
这段代码生成一个大小为10行4列的矩阵,其中的元素是根据正态分布随机生成的随机数,然后将这些随机数四舍五入为整数。
- rnorm(40, 85, 5):这个函数生成一个长度为40的随机数向量,这些随机数来自均值为85、标准差为5的正态分布。这个向量中的元素是根据这个正态分布随机生成的。
- round(rnorm(40, 85, 5)):将上述生成的随机数向量中的每个元素四舍五入为最近的整数。
- matrix(round(rnorm(40, 85, 5)), 10, 4):将上一步生成的四舍五入后的随机数向量重新组织成一个大小为10行4列的矩阵。这样,矩阵的每一行包含4个四舍五入后的随机数。
- 计算平均值和标准差
> averagecourse<-apply(studentdata[,3:6],2,mean)
> averagecourse
Course2 Course3 Course4 Course5
84.6 84.4 83.7 86.0
> varcourses<-apply(studentdata[,3:6],2,sd)
> varcourses
Course2 Course3 Course4 Course5
5.081557 7.574812 3.802046 5.249339
- 选出符合条件的学生
> newstudents<-subset(studentdata,Course1=="Excellent" & Course5>median(Course5))
> newstudents
ID Course1 Course2 Course3 Course4 Course5
1 1 Excellent 79 85 83 92
3 3 Excellent 84 92 89 88
8 8 Excellent 79 71 82 91
9 9 Excellent 90 83 77 91
- 计算平均分并排序
> studentdata$Average<-apply(studentdata[,3:6],1,mean)
> studentdata
ID Course1 Course2 Course3 Course4 Course5 Average
1 1 Excellent 79 85 83 92 84.75
2 2 Good 80 89 82 80 82.75
3 3 Excellent 84 92 89 88 88.25
4 4 Excellent 90 96 86 76 87.00
5 5 Good 79 79 84 88 82.50
6 6 Excellent 85 82 90 82 84.75
7 7 Good 90 77 82 87 84.00
8 8 Excellent 79 71 82 91 80.75
9 9 Excellent 90 83 77 91 85.25
10 10 Good 90 90 82 85 86.75
> studentdata[order(-studentdata $ Average),]
ID Course1 Course2 Course3 Course4 Course5 Average
3 3 Excellent 84 92 89 88 88.25
4 4 Excellent 90 96 86 76 87.00
10 10 Good 90 90 82 85 86.75
9 9 Excellent 90 83 77 91 85.25
1 1 Excellent 79 85 83 92 84.75
6 6 Excellent 85 82 90 82 84.75
7 7 Good 90 77 82 87 84.00
2 2 Good 80 89 82 80 82.75
5 5 Good 79 79 84 88 82.50
8 8 Excellent 79 71 82 91 80.75
注意:使用order函数后面还有一个逗号!
12.日期
- 输出:R语言中日期的标准格式是yyyy-mm-dd。
> as.Date("2024-03-18")
[1] "2024-03-18"
> class(as.Date("2024-03-18"))
[1] "Date"
> as.Date("03/18/2024")
Error in charToDate(x) :
character string is not in a standard unambiguous format
> as.Date("03/18/2024","%m/%d/%Y")#也可以通过定义来实现其他输入形式并转化为标准格式
[1] "2024-03-18"
注意:month必须在date前面
- 计算
- 输出
> date<-as.Date("2024-3-18")
> weekdays(date)#输出星期几
[1] "Monday"
> months(date)#输出月份
[1] "March"
> substr(as.POSIXct(date),1,4)#输出年份
[1] "2024"
> as.POSIXct(date)#输出日期时间类(更精确的时间)
[1] "2024-03-18 UTC"
> quarters(date)
[1] "Q1"
POSIXct class:日期时间类是用于表示日期和时间的一种更详细的类型。它包含年、月、日、时、分、秒等信息。POSIXct类的对象可以使用as.POSIXct()函数创建,其格式通常是YYYY-MM-DD HH:MM:SS。
13.数据输出
- 保存本地数据集.RData
# 生成一系列数据
data <- data.frame(ID = 1:10, Value = rnorm(10))
# 将数据保存到本地
save(data, file = "statistic app/data.RData")
# 加载数据
load("statistic app/data.RData")
# 查看加载的数据
print(data)
- 创建一个CSV文件
# 生成一系列数据
data <- data.frame(ID = 1:10, Value = rnorm(10))
# 使用write.csv函数
write.csv(data, "statistic app/data.csv", row.names = FALSE)
- 创建一个Excel文件
# 加载openxlsx包
library(openxlsx)
# 生成一系列数据
data <- data.frame(ID = 1:10, Value = rnorm(10))
# 将数据写入Excel文件
write.xlsx(data, file = "statistic app/data.xlsx", rowNames = FALSE)
三者比较:
RData最快,Excel最慢
RData占空间最小(存储大型数据节约空间)