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 <-50Lif(is.integer(x)){
print("X 是一个整数")}else{
print("X 不是一个整数")}
while 循环
a =1while(a<5){
print('hello')}
for 循环
a = c([1:4])for(i in a){
print(i)}
repeat循环
a =1
sum =0repeat{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
233345# 访问时可以用通常的方法,还可以用元素名访问
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,]1234[2,]5678[3,]9101112
常用函数
- 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]857690
列表的引用与修改
列表元素可用"列表名[[下标]]" 引用,列表不同于向量,每次只能引用一个元素,如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 黎明 301802 周杰伦 351753 刘德华 28173
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.16666670.20000000.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.002.253.504.756.00
summary():描述统计量
summary():获取描述性统计量,可以提供最小值、最大值、四分位数和数值型变量的均值,以及因子向量和逻辑型向量的频数统计等。
结果解读如下:
a=c(1:6)
summary(a)
得到的结果
> summary(a)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.002.253.503.504.756.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语言基础作图
- 图形的创建和保存 通过交互式会话构建图形
data0 <- read.csv(“height-weight.csv”, header=TRUE, sep=“,”)plot(data0[,3], data0[,4])abline(lm(data0[,4]~data0[,3]))title(“身高和体重关系图”)
保存图形 - 自定义图形修饰—图形参数 通过图形参数选项定义图形的多个特征(字体、颜色、坐标轴、标题)
- 标注的使用
- 组合多个图形
4.1 类型图
- 条形图
- 饼图
- 直方图
- 核密度图
- 箱线图
- 点图
- 散点图
- 折线图
- 相关图
- 马赛克图
代码实现:
#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 in1: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. 基本统计分析
- 描述性统计分析
- 频数表和列联表
- 相关系数和协方差
- t 检验
- 组间差异的非参数检验代码实现:
#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)
版权归原作者 uuuri 所有, 如有侵权,请联系我们删除。