【编程语言入门】R

文章目录

前言一、基础操作1.新建文件2.添加/取消注释3.运行程序4.获取/设置工作目录5.赋值6.显示变量7.查看/清除变量8.函数帮助9.安装R包

二、函数1.文件读取2.读入数据

三、语法1.向量2.矩阵3.数组4.数据框5.列表6.因子7.缺失值8.随机抽样9.排序9.其他数学公式10.字符型函数11.Apply函数12.日期13.数据输出

前言

本学期学习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

> 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

4 4 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占空间最小(存储大型数据节约空间)