R 语言学习笔记

本文介绍了R语言的基础知识,包括赋值、向量创建、矩阵、数据框的操作,以及流程控制语句如if、while、for和repeat。同时,讲解了统计分析中的向量运算、描述统计量和作图方法,如散点图、直方图等。此外,文章还涵盖了如何处理缺失值和数据转换,以及读写文件的基本操作。
摘要由CSDN通过智能技术生成

1. 基础语法

赋值
a = 10;
b <- 10;# 表示流向,数据流向变量,也可以写成10 -> b
创建不规则向量

不用纠结什么是向量,就当作一个容器,数据类型要相同

a = c("我","爱","沛")
创建一定规则的向量

rep就是repeat的意思,就是重复

x <- seq(1, 10, by = 0.5)  # 得到1.0  1.5  2.0  2.5  3.0  3.5  4.0  4.5  5.0  5.5  6.0  6.5  7.0  7.5  8.0  8.5  9.0  9.5 10.0
x <- seq(1, 10, length = 21)  # 从1到10,得到21个等间距数
x <- rep(2:5, 2)  # 得到2 3 4 5 2 3 4 5
x <- rep(2:5, rep(2, 4))  # 得到2 2 3 3 4 4 5 5
创建连续的数字向量
a = c(1:5)  # 可以得到1 2 3 4 5
运算符
数值运算符
	+  -  *  /
	^  # 乘方
	%%  # 求余
	%/%  # 整除

关系运算符
	>  <  ==  !=  >=  <=

逻辑运算符
	&&  ||  !

其他运算符
	:  # 冒号运算符,用于创建一系列数字的向量。
	%in%  # 用于判断元素是否在向量里,返回布尔值,有的话返回 TRUE,没有返回 FALSE。
	%*%  # 用于矩阵与它转置的矩阵相乘。
数学函数

常见对一些数学函数有:
在这里插入图片描述
R 中的 round 函数有些情况下可能会"舍掉五"。当取整位是偶数的时候,五也会被舍去
在这里插入图片描述

常见常量
  • 26个大写字母 LETTERS
  • 26个小写字母 letters
  • 月份简写 month.abb
  • 月份名称 month.name
  • π 值 pi
缺失值转为0
x [!is.na(x)]=0
数字与字符串互换
字符串转为数值型
as.integer("12.3")  # 字符串转整数,得到12
as.double("11.666")  # 字符串转小数,得到11.666
数值型转为文本

使用 paste()

a = paste(1) 

formatC() 数值作为字符串输出

formatC(1/3, format = "e", digits = 4)  # digits表示小数点位数
formatC(1/3, format = "f", digits = 4)

as.character()

a = as.character(66)

流程控制

if 语句
x <- 50L
if(is.integer(x)) {
   print("X 是一个整数")
} else {
   print("X 不是一个整数")
}
while 循环
a = 1
while(a<5){
    print('hello')
}
for 循环
a = c([1:4])

for(i in a){
    print(i)
}
repeat循环
a = 1
sum = 0
repeat{
  if(sum>10){
    break  # break终止循环,next继续下一次循环,就好像python的continue
  }
  sum=sum+a
  a=a+1
}
print(sum)

2. 常用数据结构

在这里插入图片描述

向量:c()

特点:
  • 只能存放一种元素,如果存在数字和字符串,就会自动转为字符串哦
  • 可以试用索引获取元素(索引从1开始)
  • 可以使用切片操作截取一个片段,两端都是闭区间、
使用append添加值
good_sample_p <- append(good_sample_p,p)
向量加减乘除运算

有一个好玩的是,向量的循环利用法则,比如a=c(1,2,3),b=c(4,5),这时如果让a+b就会有警告信息,但是它不报错。

以a+b为例:其实就是(1+4,2+5,3+4),现在懂了什么是循环利用了吧

一些常用的函数
  • sqrt(x), log(x), exp(x), sin(x), cos(x), tan(x), abs(x)分别表示平方根, 对数, 指数, 三角函数及绝对值.
  • sort(x, decreasing=FALSE)返回按x的元素从小到大排序的结果向量.
  • order(x)是使得x从小到大排列的元素下标向量
  • sort(x)与x[order(x)]是等效的
  • numeric(n): 表示长度为n的零向量
  • all(log(10 * x) > x):判断一个逻辑向量是否为真值
  • any(log(10 * x) > x): 判断是否有真值
  • is.na(c(1, 2, NA)): 判断x的每一个元素是否是缺失值
向量索引

R中向量的下标从 1 开始,这与通常的统计或数学软件不一致,C语言、Python等编程语言的向量下标则从 0 开始!

不要被python带跑了啊,R的负值索引表示删除第几个元素

x = c(42, 7, 64, 9)
x[2]  # 访问第2个元素
x[3] = -1  # 修改第三个数据的值
x[-4]  # 删除第四个元素
x[x < 10]  # 表示选取x<10的元素
x[c(1, 4)]  # 向量索引,是不是很神奇?

定义向量时可以给元素加上名字

ages <- c(Li = 23, Zhang = 33, Wang = 45)
# ages为
Li   Zhang  Wang 
23    33         45 
# 访问时可以用通常的方法,还可以用元素名访问
ages["Zhang"]
# 还可以定义向量后,再后加上名字
age1 = c(21, 34, 56)
names(age1) = c("Zhang", "Ding", "Liu")

矩阵:matrix

matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)

data 是矩阵的数据,通常为向量
nrow 为行数,ncol 为列数
byrow 为 TRUE 时,是横着的1,2,3,4,否则变成竖着的1,2,3了

创建矩阵
matrix(1:12,ncol=4,byrow=TRUE)
# 得到的数据
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12
常用函数
  • head(a,10) 查看矩阵前10
  • tail(a,10) 查看矩阵后十行
  • cbind(): 进行上下合并
  • rbind(): 进行左右合并
  • c(A): 显示A的所有向量,是按列拉直的向量
  • det(A): 求行列式的值
  • solve(A): 求逆
  • eigen(A): 特征值和特征向量
矩阵运算

类似于向量的加减乘除

参与运算一般是相同形状的,形状不一致的向量和矩阵也可进行四则运算。规则是矩阵的数据按向量(按列拉直)的对应元素进行运算。

访问矩阵元素和子矩阵
  • A[2,3]#访问是矩阵的(2,3)元素7
  • A[i,]#访问第i行,A[,j] #访问第j列
  • A[,c(1,2,3)]前三列
  • A[,c(‘name1’,‘name2’)]指定列名
对矩阵的行标和列标重新命名
rownames(A)  <- c("a", "b", "c")
colnames(A) <- paste("X", 1:4, sep="")
apply函数

对矩阵想对某行(列)进行某种计算,可用apply函数:apply(x, margin, fun, …)

x表示矩阵,margin=1表示对每行计算,margin=2表示对每列计算,fun是用来计算的函数。

apply(A, 1, sum)
apply(A, 2, mean)

因子:factor

factor(x, levels = sort(unique(x), na.last = TRUE), labels, exclude = NA, ordered = FALSE)

用来把一个向量编码为一个因子

创建因子
sex = c("M","F","M","M","F")
sexf = factor(sex);sexf
常用函数
  • s.factor()检验对象是否是因子
  • as.factor()把向量转化为因子
  • levels(x)可以得到因子的水平
  • table(x)统计各类数据的频数
tapply()函数

tapply(x, INDEX, FUN=NULL,…,simplify=TRUE)

  • x是一对象,通常为一向量
  • INDEX是与X有同样长度的因子
  • FUN是要计算的函数

知道5位学生的性别,还知道这5位学生的身高,分组求身高的平均值

sex = c("M","F","M","M","F")
height = c(174, 165, 180, 171, 160)
tapply(height, sex, mean)

列表:list

创建列表
rec <- list(name="黎明", age=30, scores=c(85,76,90));rec
# 得到的数据
$name
[1] "黎明"

$age
[1] 30

$scores
[1] 85 76 90
列表的引用与修改

列表元素可用"列表名[[下标]]" 引用,列表不同于向量,每次只能引用一个元素,如rec[[1:2]]是不允许的

rec <- list(name="黎明", age=30, scores=c(85,76,90));rec
rec[[2]]  # 得到30
rec[[3]][2]  # 得到第三个元素的第二个元素,即76
# 若指定了元素的名字,则引用列表元素还可以用它的名字作为下标,
rec$age
rec[["age"]]
rec[[2]]=11  # 把30修改为11

注意:"列表名[下标]"或"列表名[下标范围]"的用法是允许的,但与前面的含义不同,它还是一个列表

数据框:data.frame

数据框通常是矩阵形式的数据,但矩阵各列可以是不同类型。数据框每列是一个变量,每行是一个观测。

和 DataFrame 类似

生成数据框
d = data.frame(name=c('黎明','周杰伦','刘德华'),age=c(30,35,28),height=c(180,175,173))
# d的值
    name age height
1   黎明  30    180
2 周杰伦  35    175
3 刘德华  28    173

as.data.frame(list)可以将列表转为data.frame(),因为列表不是可以指定名称嘛

数据框的引用
d = data.frame(name=c('黎明','周杰伦','刘德华'),age=c(30,35,28),height=c(180,175,173))
d[1:2, 2:3]  # 得到前两行,2,3列的数据
d[["age"]]  # 获取age这一列的数据
# 等价于
d$height  # 获取height这一列的数据
rownames(d) = c("one", "two", "three")  # 各行也可以定义名字,指定index
修改值
d$name[1] = "我爱你"  #将name的第一个值修改为我爱你   常用
d[1,2] = "女"  #将第1行第2列的值修改为“女”   常用
d[[1]][2] = "我爱你"  #将第一列第二个值改为“我爱你”
添加删除行列
d = df1[-2,] #删除第2行数据
d = df1[,-3] #删除第3列的数据
d = df1[-c(1,3),] #删除第1行和第3行的数据
d$r = age/weight  # 添加列r
attach()函数

R提供了函数attach()可以把变量调入内存。就是像咱们的d$height或d[[“age”]],就不用这样写了,直接写age就好了

d = data.frame(name=c('黎明','周杰伦','刘德华'),age=c(30,35,28),height=c(180,175,173))
attach(d)
r <- age/height  # /对r进行修改不会影响d的数据
# r的值
[1] 0.1666667 0.2000000 0.1618497
detach(d) #取消连接
merge()

把多个数据框合并成一个数据框

merge(data1, data2, by='ID')

数据的读取与保存

读取txt:read.table()
read.table(“filename.txt”)
读取xlsx:read.xlsx()

要先先安装xlsx包,然后导入xlsx包

data <- read.xlsx(“filename.xlsx”,n)
保存csv:write.csv()
write.csv(data,file = “文件名”)
保存 xlsx:write.xlsx()
write.xlsx(data, “data.xlsx”,sheet.name=“sheet1”)
保存R中为图片、pdf文件

以png为例

png(file="myplot.png", bg="transparent")  #文件不指定地址,默认放在getwd()里了

# 这里写你的画图程序#

dev.off()  # 记得off

# 下面是一个实例
png(file="myplot.png")
plot(1:10)
rect(1, 5, 3, 7)
dev.off()

3. R的一些常用函数

mean:获取均值
a=c(1:6)
mean(a)
median:获取中位数
a=c(1:6)
median(a)
获取众数

R语言中没有专门的函数获取众数,因此要手写

# 创建函数
getmode = function(v) {
   uniqv = unique(v)  # unique主要是返回一个把重复元素或行给删除的向量、数据框或数组
   uniqv[which.max(tabulate(match(v, uniqv)))]
}
 
# 创建向量
v = c(2,1,2,3,1,2,3,4,1,5,5,3,2,3)
 
# 调用函数
result = getmode(v)
print(result)
quantile():百分位数,默认为5个
a=c(1:6)
quantile(a)

# 得到的结果
> quantile(a)
  0%  25%  50%  75% 100% 
1.00 2.25 3.50 4.75 6.00 
summary():描述统计量

summary():获取描述性统计量,可以提供最小值、最大值、四分位数和数值型变量的均值,以及因子向量和逻辑型向量的频数统计等。

结果解读如下:

a=c(1:6)
summary(a)

得到的结果

> summary(a)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    2.25    3.50    3.50    4.75    6.00 
var():计算方差
a = c(1:5)
var(a)
sd():标准差
a = c(1:5)
sd(a)
变异系数

方差除以平均值

当需要比较两组数据离散程度大小的时候,如果两组数据的测量尺度相差太大,或者数据量纲的不同,直接使用标准差来进行比较不合适,可以使用变异系数

sort、order:排序、指定排序规则
x = c(1,7,5,4,4,6,9)
x = sort(x,decreasing=FALSE)  # 返回升序排列结果,当decreasing为TRUE时为降序排列
# 或者
x_order = order(x,decreasing=FALSE)  # 返回升序后的下标, decreasing为TRUE时为降序排列
x = x[x_order]

要对一个矩阵x进行排序,先根据第一列升序排列,然后根据第二列升序排序,可以用下面的语句实现:

x[order(x[,1],x[,2]),]

注:降序的话加上decreasing参数即可。

处理缺失值

对于NA值来说,有些计算会保存,我们需要忽略NA,加上下面的参数即可:na.rm=TRUE,例如

mean(height,na.rm=TRUE)
[1] 5.855
cor():计算两个变量之间的相关系数(可略)
cor(height,log(height))
cov():两个变量之间的协方差(可略)
cov(height,log(height))
shapiro.test():判断数据是否满足正态分布

一般情况下,当返回的p-value大于0.05时表示满足。

4. R语言基础作图

  1. 图形的创建和保存
    通过交互式会话构建图形
    data0 <- read.csv(“height-weight.csv”, header=TRUE, sep=,)
    plot(data0[, 3], data0[, 4])
    abline(lm(data0[, 4]~data0[, 3]))
    title(“身高和体重关系图”)
    
    保存图形
    在这里插入图片描述
  2. 自定义图形修饰—图形参数
    通过图形参数选项定义图形的多个特征(字体、颜色、坐标轴、标题)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  3. 标注的使用
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  4. 组合多个图形
    在这里插入图片描述

4.1 类型图

  1. 条形图
    在这里插入图片描述

  2. 饼图
    在这里插入图片描述

  3. 直方图
    在这里插入图片描述

  4. 核密度图
    在这里插入图片描述

  5. 箱线图在这里插入图片描述

  6. 点图
    在这里插入图片描述

  7. 散点图
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  8. 折线图
    在这里插入图片描述
    在这里插入图片描述

  9. 相关图
    在这里插入图片描述

  10. 马赛克图
    在这里插入图片描述

代码实现:

#1. 添加了最佳拟合曲线的散点图
attach(mtcars)
plot(wt,mpg,main="Basic Scatter plot of MPG vs. Weight",xlab="Car Weight",ylab="Miles per Gallon",pch=19)
abline(lm(mpg~wt),col="red",lwd=2,lty=1)
install.packages("car")
library("car")
scatterplot(mpg~wt|cyl,data=mtcars,lwd=2,main="Scatter plot of MPG vs. Weight by Cylinders",xlab="Weight of Car",ylab="Miles per Gallon",boxplots="xy")

#2. 散点图矩阵
pairs(~mpg+disp+drat+wt,data=mtcars,main="Basic Scatter Plot Matrix")
scatterplotMatrix(~mpg+disp+drat+wt,data=mtcars,main="Scatter Plot Matrix via car Package")
cor(mtcars[c("mpg","wt","disp","drat")])
install.packages("gclus")
library("gclus")
mydata <- mtcars[c("mpg","wt","disp","drat")]
mydata.corr <- abs(cor(mydata))
mycolors <- dmat.color(mydata.corr)
myorder <- order.single(mydata.corr)
cpairs(mydata,myorder,panel.colors=mycolors,gap=0.5,main="Variable Ordered and Colored by Correlation")

#3. 高密度散点图
set.seed(1234)
n <- 10000
c1 <- matrix(rnorm(n,mean=0,sd=0.5),ncol=2)
c2 <- matrix(rnorm(n,mean=3,sd=2),ncol=2)
mydata <- rbind(c1,c2)
mydata <- as.data.frame(mydata)
names(mydata) <- c("x","y")
with(mydata,plot(x,y,pch=19,main="Scatter plot with 10000 observations"))
with(mydata,smoothScatter(x,y,main="Scatterplot Colored by Smoothed Densities"))
install.packages("hexbin")
library("hexbin")
with(mydata,{
             bin <- hexbin(x,y,xbins=50)
			 plot(bin,main="Hexagonal Binning with 10000 Observations")})
install.packages("IDPmisc")
library("IDPmisc")
with(mydata,iplot(x,y,main="Image Scatter Plot with Color Indicating Density"))

#4. 三维散点图
install.packages("scatterplot3d")
library("scatterplot3d")
with(mtcars,scatterplot3d(wt,disp,mpg,main="Basic 3D Scatter Plot"))
with(mtcars,scatterplot3d(wt,disp,mpg,pch=16,highlight.3d=TRUE,type="h",main="3D Scatter Plot with vertical lines"))

install.packages("rgl")
library("rgl")
with(mtcars,plot3d(wt,disp,mpg,col="red",size=5))

install.packages("Rcmdr")
library("Rcmdr")
with(mtcars,scatter3d(wt,disp,mpg))

#5. 气泡图
attach(mtcars)
r <- sqrt(disp/pi)
symbols(wt,mpg,circle=r,inches=0.30,fg="white",bg="lightblue",main="Bubble Plot with point size",xlab="Weight of Car",ylab="Miles per Gallon")
text(wt,mpg,rownames(mtcars),cex=0.6)
detach(mtcars)

#6. 折线图
opar <- par(no.readonly=TRUE)
par(mfrow=c(1,2))
t1 <- subset(Orange,Tree==1)
with(t1,plot(age,circumference,xlab="Age (days)",ylab="Circumference (mm)",main="Orange Tree 1 Growth"))
with(t1,plot(age,circumference,xlab="Age (days)",ylab="Circumference (mm)",main="Orange Tree 1 Growth",type="b"))
par(opar)

Orange$Tree <- as.numeric(Orange$Tree)
ntrees <- max(Orange$Tree)
xrange <- range(Orange$age)
yrange <- range(Orange$circumference)
plot(xrange,yrange,type="n",xlab="Age (days)",ylab="Circumference (mm)")
colors <- rainbow(ntrees)
linetype <- c(1:ntrees)
plotchar <- seq(18,18+ntrees,1)
for(i in 1:ntrees) {
                    tree <- subset(Orange,Tree==i)
					lines(tree$age,tree$circumference,type="b",lwd=2,lty=linetype[i],col=colors[i],pch=plotchar[i])}
title("Tree Growth","example of line plot")
legend(xrange[1],yrange[2],1:ntrees,cex=0.8,col=colors,pch=plotchar,lty=linetype,title="Tree")

#7. 相关图
options(digits=2)
cor(mtcars)
install.packages("corrgram")
library("corrgram")
corrgram(mtcars,order=TRUE,lower.panel=panel.shade,upper.panel=panel.pie,text.panel=panel.txt,main="Correlogram of mtcars intercorrelations")

#8. 马赛克图
ftable(Titanic)
install.packages("vcd")
library("vcd")
mosaic(Titanic,shade=TRUE,legend=TRUE)

5. 基本统计分析

  1. 描述性统计分析
    在这里插入图片描述
  2. 频数表和列联表
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  3. 相关系数和协方差
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  4. t 检验
    在这里插入图片描述
    在这里插入图片描述
  5. 组间差异的非参数检验
    在这里插入图片描述
    在这里插入图片描述
    代码实现:
#2.描述性统计变量
rawdata <- read.csv("student_score.csv",header=TRUE,sep=",",row.names="name")
dim(rawdata)
head(rawdata)
tail(rawdata)
fivenum(rawdata[,3])
sapply(rawdata[,3:5],mean)
apply(rawdata[,3:5],2,mean)
apply(rawdata[,3:5],1,mean)
aggregate(rawdata[,3:5],by=list(gender=rawdata$gender),max)
dstats <- function(x)(c(max=max(x),min=min(x)))
by(rawdata[,3:3],rawdata$gender,dstats)

#3.频数表和列联表
library("vcd")
rawdata <- Arthritis
mytable1 <- with(rawdata,table(Improved))
prop.table(mytable1)
mytable2 <- with(rawdata,table(Sex,Improved))
margin.table(mytable2,1)
margin.table(mytable2,2)
addmargins(mytable2)
addmargins(mytable2,1)
addmargins(mytable2,2)
mytable3 <- with(rawdata,table(Treatment,Sex,Improved))
mytable4 <- xtabs(~Sex+Improved,data=rawdata)
mytable5 <- with(rawdata,ftable(Sex,Improved))

chisq.test(mytable2)
mytable6 <- with(rawdata,table(Treatment,Improved))
chisq.test(mytable6)
fisher.test(mytable6)

assocstats(mytable6)

#4.相关系数和协方差
states <- state.x77[,1:6]
cov(states)
cor(states)
cor(states,method="spearman")
install.packages("ggm")
library("ggm")
pcor(c(1,5,2,3,6),cov(states))
cor.test(states[,3],states[,5])
install.packages("psych")
library("psych")
corr.test(states,use="complete",method="spearman")

#5. t检验
library("MASS")
t.test(Prob~So,data=UScrime)
with(UScrime,t.test(U1,U2,paired=TRUE))

#6. 组间差异的非参数检验
wilcox.test(Prob~So,data=UScrime)
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值