R语言·绘图入门&数据基本操作 您所在的位置:网站首页 r语言中绘制直方图的函数 R语言·绘图入门&数据基本操作

R语言·绘图入门&数据基本操作

2024-04-17 01:05| 来源: 网络整理| 查看: 265

小罗碎碎念

想必大家选这门课的初衷,大多是想利用R语言来画图,所以,本章的内容首先从常见的统计图讲起。讲完绘图部分以后,会介绍一下数据的基本操作,包括向量以及高级数据结构等。

一、绘图入门

首先给你看一看R语言强大的绘图功能,怎么样,是不是很腻害。但是万丈高楼平地起,我们慢慢来。

R 中的常量分为四种类型:

逻辑型:TRUE和FALSE;数值型:25.6, 3.1415926;字符型:身份证号码“11010”和地名“Beijing”;因子型:分类数据(性别:男,女)和顺序数据(职称:助教,讲师,副教授,教授)。

给变量赋值用“=”或者“

好,现在回归正文!R中有个非常有用的命令可以生成向量:

连接命令c

这里插一嘴,c表示connect,取的是首字母,不要以为c代表向量哈。

ab例:生成因子型常量的R程序

类别变量在R中称为因子(factor),因子的取值称为水平(level)

x

有些同学可能看着输出结果有些懵,我解释一下——这段代码首先创建了一个名为x的向量,其中包含了5个字符串元素,分别是"Beijing"、"Shanghai"、"Beijing"、"Beijing"和"Shanghai"。然后,使用factor函数将x向量转换为一个因子向量y。

factor函数将一个向量转换为因子类型,将向量中的每个元素转换为一个因子级别。在这个例子中,factor函数将x向量中的每个元素转换为一个单独的因子级别。由于factor函数的默认行为是将字符串类型的元素转换为因子级别,因此y向量中将包含5个因子级别,分别对应于x向量中的每个元素。

最后,使用y变量来输出转换后的因子向量。在R中,如果未指定因子向量的水平(levels),则默认情况下,R将使用元素本身作为因子水平。因此,在这种情况下,y向量的因子水平将是x向量中的所有不同元素,即"Beijing"和"Shanghai"。

其实想搞懂代码是什么意思,还有一个很简单的方法,就是稍微对它做一些改动即可,比如我们再添加一个城市——Guangzhou。

1-2:向量与标量的运算

其结果为对向量中每一个元素进行运算。

例子x=c(1,2,5); 2*x10+x1-3:向量与向量的运算

如果两个向量长度相等,则运算结果为对应位置元素进行标量运算;如果两个向量长度不等,则将较短向量做循环运算。

例子x=c(1,2,5) y=c(10,11,12) x+yx=c(1,2) y=c(10,11,12,13) x+y

这里稍微注意一下,因为x比y短,所以12对应1,13对应2。同理,为了方便大家理解,我把代码简单修改一下。

你会发现,其实就是1依次与每一个数相加。

1-4:R中常用的统计计算函数maxminmeanmediansdvarsum最大值最小值均值中位数标准差方差求和例x=c(1,2,5) mean(x)median(x)二、绘图实操

五种常见的统计图的画法

折线图 饼图柱形图直方图箱式图

R语言画图参考网站:R语言 | 数据分析--统计绘图。我看了一下,内容挺多,但是排版我不喜欢,所以我找时间重新整理一遍,再补充一些新的东西进去。

2-1:折线图

plot函数:它是R中最常用的画图命令,可以绘制大多数常用的点图、线图。

语法结构为:plot(x,y,…)

例如

x=seq(0,10,0.5) y=sin(x) plot(x,y,type="o",xlab="X", ylab="sin(X)")

这段R代码定义了一个从0到10的等差数列,公差为0.5,并将其存储在变量x中。然后,代码计算了x中每个元素的sin值,并将结果存储在变量y中。最后,代码使用plot()函数绘制了x和y的散点图,其中type="o"表示使用圆圈来表示数据点,xlab="X"表示x轴的标签为"X",ylab="sin(X)"表示y轴的标签为"sin(X)"。

接着上述程序,可以添加更多的信息:

points(x+1,y,pch=5) lines(x+1,y,lwd=2) title("Plot of sin(X)")

这段R代码在之前的基础上,添加了以下内容:

points(x+1,y,pch=5):使用points函数在坐标系中绘制了一些点,这些点的横坐标是x+1,纵坐标是y,使用符号pch=5表示绘制圆点。lines(x+1,y,lwd=2):使用lines函数绘制了一条线,这条线的横坐标是x+1,纵坐标是y,线宽为2。title("Plot of sin(X)"):使用title函数给图表加上了一个标题,标题是"Plot of sin(X)"。

正常情况下,你输出的应该和我下面这幅图一样,但是,你会发现PPT上给的图不太一样——第一条曲线的颜色是红色,而我们这仍然是黑色。

不要慌,我们来改一下代码,你直接整体复制过去就行,其实就在plot后面加了一个参数。

x=seq(0,10,0.5) y=sin(x) plot(x,y,type="o",xlab="X", ylab="sin(X)",,col="red") points(x+1,y,pch=5) lines(x+1,y,lwd=2) title("Plot of sin(X)")2-2:饼图

饼图就是将一个圆(或者圆饼)按分类变量分成几块,每一块所占的面积比例就是相对应的变量在总体中所占的比例。

【例1】随机产生10年的数据year2-5: 箱线图

箱线图通过绘制连续型变量的五个分位数(最大值、最小值、25%分位数、75%分位数以及中位数)描述变量的分布。

x1三、“Pima”数据集

R语言程序包MASS中有内嵌数据集“Pima”,该数据集包含了532个样本的血清胰岛素记录数据,这些数据是由美国国家糖尿病和消化及肾脏疾病研究所收集的住在亚利桑那州凤凰城附近的皮马印第安人妇女的数据。

在画图前,首先完成一些准备工作。

library(MASS) #加载MASS软件包 data(Pima.tr) #加载Pima.tr数据集 Pima = rbind(Pima.tr,Pima.te) # 合并数据集 # 抽取数据举例 Pima_n=Pima[Pima$type=='No'& Pima$age==22,] #抽取Pima数据集中年龄=22岁,非糖尿病患者的数据 3-1:直方图举例

#画出Pima_n中血压的直方图

hist(Pima_n$bp,main="Histogram of diastolic \n blood pressure",xlab="Blood pressure (mm Hg)")

这段代码是R语言中绘制直方图的代码,主要用于展示Pima_n数据集中舒张压(diastolic blood pressure)的分布情况。

直方图是一种统计图表,用于展示连续性变量的分布情况。在这段代码中,主要做了以下几件事情:

调用hist()函数:这是一个内置的R函数,用于绘制直方图。传入两个参数:Pima_n$bp:这是我们要绘制直方图的数据,来自Pima_n数据集。bp表示blood pressure,即血压。main:这是一个字符串,用于表示直方图的标题。这句代码将标题设置为"Histogram of diastolic \n blood pressure",意为“舒张压的直方图”。xlab:这是一个字符串,用于表示横轴(x轴)的标签。这句代码将横轴标签设置为"Blood pressure (mm Hg)",意为“血压(毫米汞柱)”。

这段代码可以帮助研究人员更好地了解舒张压在Pima_n数据集中的分布特征,从而为进一步的数据分析和研究提供可视化依据。

3-2:折线图举例

整个代码的主要目的是展示糖尿病患者随着年龄变化的血糖中位数分布情况,从而帮助研究人员更好地了解糖尿病患者的血糖水平随着年龄的增长而发生的变化。

Pima_y=Pima[Pima$type=='Yes',] # 抽取糖尿病患者的数据 medglu = tapply(Pima_y$glu,Pima_y$age,median) # 计算每个年龄血糖的中位数 plot(medglu,xlab="Age",ylab="Median glu",type="o") # 画出年龄与血糖的折线图 title("Median plasma glucose concentration \n at different ages")

这段R代码主要用于提取糖尿病患者的数据,并计算不同年龄组血糖的中位数,最后绘制年龄与血糖中位数的折线图。以下是代码的详细解释:

Pima_y=Pima[Pima$type=='Yes',]

这行代码从Pima数据集中筛选出糖尿病患者的数据。其中,Pima是数据集的名称,'Yes'表示筛选条件,即筛选出类型为'Yes'的行,这些行对应的是糖尿病患者。

medglu = tapply(Pima_y$glu,Pima_y$age,median)

这行代码计算每个年龄组血糖的中位数tapply()函数用于对数据进行分组计算,这里将Pima_y数据按照年龄(Pima_yage)分组,并对每组的血糖值(Pimay​glu)求中位数。

plot(medglu, xlab="Age", ylab="Median glu", type="o")

这行代码绘制年龄与血糖中位数的折线图。plot()函数用于绘制折线图,传入的参数包括:

medglu:上一步计算得到的血糖中位数数据。xlab:横轴标签,设置为"Age",表示横轴为年龄。ylab:纵轴标签,设置为"Median glu",表示纵轴为血糖中位数。type:"o",表示绘制折线图时使用的符号类型,这里使用的是圆点。title("Median plasma glucose concentration \n at different ages")

这行代码设置图表的标题。标题为"Median plasma glucose concentration at different ages",意为“不同年龄组血糖中位数的变化”。

3-3:饼图举例

这段代码的目的是从Pima_y数据框中提取怀孕次数的数据,并绘制一个饼图显示不同怀孕次数的百分比

xx = Pima_y$npreg # 抽取怀孕次数的数据 t = table(xx) # 计算频数 data = as.data.frame(t) #将频数表转换成数据框 colnames(data) = c('npreg', 'Freq') #修改数据框的列名 percentage = round(data$Freq / sum(data$Freq), 2) * 100 # 计算百分比 percentage = paste0(percentage, "%") # 添加百分号 lb = paste0(names(t),": ",percentage) # 添加标签 pie(data$Freq, labels=lb) # 画出饼图 title("Piechart of numbers of pregnancies") # 添加标题

下面我将逐行解释这段代码:

xx = Pima_y$npreg

从Pima_y数据框中提取怀孕次数的数据,并将其存储在名为xx的向量中。

t = table(xx)

使用table函数计算xx向量中每个元素的频数,并将结果存储在名为t的向量中。

data = as.data.frame(t)

将t向量转换为数据框格式,以便后续操作。

colnames(data) = c('npreg', 'Freq')

修改数据框data的列名,使其包含“npreg”和“Freq”两列,相当于给表格的列取个名字。

percentage = round(data$Freq / sum(data$Freq), 2) * 100

计算每个怀孕次数的百分比。这里我们先计算每个怀孕次数的频率占总频率的比例,然后将结果四舍五入到小数点后两位,并乘以100,得到百分比。

percentage = paste0(percentage, "%")

在百分比后面添加一个百分号。paste0()是R语言中的一个函数,用于将字符串拼接起来。

lb = paste0(names(t),": ",percentage)

创建一个字符串向量lb,其中包含每个怀孕次数的名称和对应的百分比。

pie(data$Freq, labels=lb)

使用pie函数绘制饼图,显示不同怀孕次数的百分比。data$Freq表示每个怀孕次数的频率,labels表示对应的标签。

title("Piechart of numbers of pregnancies")

为饼图添加标题“Piechart of numbers of pregnancies”,表示饼图的主题是怀孕次数的饼图。

3-4:柱形图举例

这段代码首先创建一个条形图,显示Pima_n数据框中BMI和皮肤厚度的分布情况,然后添加一个图例说明各个条形的含义最后添加一个标题表示图表的主题

barplot(rbind(Pima_n$bmi,Pima_n$skin),col=c("orange","brown")) legend("topleft", c("BMI","skin"), cex=0.6, fill=c("orange","brown")) title("BMI and skin thickness")

下面我将逐行解释这段代码:

barplot(rbind(Pima_n$bmi, Pima_n$skin), col=c("orange", "brown"))

使用barplot函数创建一个条形图,横轴表示Pima_n数据框中的BMI和皮肤厚度(skin)两个变量。rbind()函数将这两个变量组合成一个矩阵,然后barplot()函数根据这个矩阵的行和列创建条形图。col参数表示每个条形的颜色,这里使用c("orange", "brown")表示两个颜色。

legend("topleft", c("BMI", "skin"), cex=0.6, fill=c("orange", "brown"))

创建一个图例,显示条形图中的颜色和标签。"topleft"表示图例的位置,c("BMI", "skin")表示图例中的标签,cex=0.6表示标签的字体大小,fill=c("orange", "brown")表示图例中填充的颜色。

title("BMI and skin thickness")

为图表添加标题,表示图表的主题是BMI和皮肤厚度。

3-5:箱式图举例

这段代码首先从Pima数据集中提取了年龄为22岁且患有糖尿病的患者数据,然后绘制了糖尿病患者和非糖尿病患者的血糖浓度箱线图,最后为图表添加了一个标题。

Pima_y=Pima[Pima$type=='Yes'& Pima$age==22,] #抽取Pima数据集中年龄=22岁,糖尿病患者的数据 boxplot(Pima_y$glu,Pima_n$glu,names=c("Diabetes","Non-diabetes"),ylab="glu",col=c("red","blue")) # 画出箱式图,比较糖尿病患者和非糖尿病患者的血糖浓度 title("Plasma glucose concentration")

下面我将逐行解释这段代码:

Pima_y=Pima[Pima$type=='Yes'& Pima$age==22,]

这一行代码用于从Pima数据集中筛选出满足以下条件的行:年龄等于22岁且糖尿病状态为'Yes'。Pima$type表示糖尿病状态,'Yes'表示糖尿病患者。&符号用于同时满足两个条件。筛选后的数据将被存储在Pima_y数据集中。

boxplot(Pima_y$glu, Pima_n$glu, names=c("Diabetes", "Non-diabetes"), ylab="glu", col=c("red", "blue"))

这一行代码使用boxplot函数绘制箱线图,比较糖尿病患者(Pima_y数据集中的血糖浓度)和非糖尿病患者(Pima_n数据集中的血糖浓度)的血糖浓度。names参数表示每个分组对应的标签,ylab参数表示纵轴标签,col参数表示每个分组的颜色。

title("Plasma glucose concentration")

这一行代码为图表添加标题,表示图表的主题是血浆血糖浓度。

四、数据的基本操作4-1:向量的基本操作

练习:score是⼀组学⽣的成绩,grade是相应的学⽣所在的年级,NA表示该学⽣缺考。

score=c(90,0,78,63,84,36,NA,84,58,80,75,85,72,78,86); grade=c(3,3,3,4,3,3,3,3,3,3,3,4,3,4,4)

在R中实现以下功能:

(1)计算学⽣总⼈数;

首先加载数据

输入

length(score)

(2)计算参加考试的学⽣⼈数;

先排除缺失值的影响

newscore

这里对代码的输出结果做一个小小的解释:

attr(,"na.action")和attr(,"class")分别输出na.omit()函数返回的元数据。[1] 7表示删除的缺失值数量为第7个。[1] "omit"表示删除缺失值时执行的操作类型为omit,即删除缺失值。

这时候再来统计人数

length(newscore)

(3)缺考的学⽣为进修⽣,成绩综合评定为80分,请补登成绩;

score[7]=80; score

(4)将三年级和四年级的学⽣成绩分别⽣成两个新的数据向量score3和 score4;

三年级score3=score[grade==3] score3四年级score4=score[grade==4] score4

(5)对(4)中⽣成的两组学⽣成绩从⼤到⼩排序;

三年级newscore3四年级newscore4

(6)将(5)中两组数据合并,取名为task1。

task14-2:对象的类别 1. 向量(vector)

⼀系列元素的组合。

2. 因⼦(factor)

因⼦是⼀个分类变量,如“a” , ”a” , ”a” , ”a” , ”b” , ”b” , ”b” , ”c” , ”c”

3. 数组(array)

数组是k维的数据表。

4. 矩阵(matrix)

矩阵是数组的⼀个特例,维数k = 2。

5. 数据框(dataframe)

是由⼀个或⼏个向量和(或)因⼦构成,它们必须是等⻓的,但可以是不同的数据类型。

6. 列表(list)

列表可以包含任何类型的对象。

4-3:矩阵

定义矩阵的语法为matrix(data, nrow, ncol, byrow=T)

例如,输入以下代码,主要目的是创建一个矩阵xx,其中包含从1到6的整数

x=1:6 xx

下面我逐行解释这段代码:

x = 1:6

这是一个向量,包含从1到6的整数。

xx

矩阵中⾏、列元素的选取

xx[2,2]

如果省略⾏标,则表示选择某⼀列,如

xx[,2]

省略列标表示选择某⼀⾏,如

xx[2,]

矩阵的运算:数乘

a=matrix(c(1,2,3,4),nrow=2,ncol=2,byrow=T) a2*a

矩阵相加

b=matrix(c(5,6,7,8),nrow=2,ncol=2,byrow=T) ba+b

矩阵的合并:增加⾏⽤rbind函数,增加列⽤cbind函数,如

a addcbind(a,add)4-4:数组

数组就是多维矩阵,定义数组的语法为:array(data,dimnames),例如

a4-5:数据框

矩阵中的所有元素必须为同⼀类型,⽽在数据框中,不同的列可以取不同的数据类型,相当于⼀个数据库中的表结构。如

a=matrix(c(1,2,3,4),nrow=2,ncol=2,byrow=T) a t4-6:列表

数据框中,要求被插⼊的数据⻓度与原来的⻓度⼀致。列表是⽐数据框更为松散的数据结构,可以将不同类型、不同⻓度的数据打包。例如

a=matrix(c(1,2,3,4),nrow=2,ncol=2,byrow=T); t五、编写程序5-1:控制结构

R的控制结构采取if…else语句,如:

x=1; if(x==1) { print("x is true"); }else { print("x is false"); }5-2:循环结构

常⽤的为for语句。例如,若要计算1+2+3+…+100的值,R程序为:

total

当然,对于上述问题有更简单的R语句:

x5-3:函数

在实现复杂算法的时候,编写函数可以重复调⽤,常⽤的函数控制命令为function语句。例:

f

由此衍⽣出了⼀个很实⽤的⼩技巧:在 R 控制台中输⼊⼀个函数名,就可以得到这个函数的代码。例如:

六、练习



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有