R语言实战 - 手打代码总结

R语言实战 - 手打代码总结

  • ch1 入门
  • ch2 数据结构
  • ch3 图形初阶
  • ch4 数据预处理
  • ch5 各类函数

ch1 入门

#CH1 
##对象可以是任何东西(数据、函数、图形、分析结果)

age<-c(1,2,3,2,11,9,3,9,12,3)
weight<-c(4.4,5.3,7.2,5.2,8.5,7.3,6.0,10.4,10.2,6.1)

mean(age)
sd(age)
cor(age,weight)
plot(age,weight)
q()#结束会话并退出R


####################### tips ########################

#demo()函数可以查看每个包所含一些函数所能作出的图形示例
demo()
demo(Hershey)
demo(persp)
demo(image)

?apply
help(package="package_name")#包的帮助
example(apply)#函数使用示例(感觉用处不是很大)
example("Arthritis")#查看数据集的自带示例

data()#当前已加载包中可用数据集

vignette("foo")#vignette文档,PDF使用介绍文档(不是所有包都有这个文档)
apropos("apply",mode = "function")#列出名称中含有apply的函数

help.start()#R帮助手册,浏览器

history()#显示历史命令(默认25)

savehistory("myfile")#保存命令到文件myfile中(后缀.Rhistory)
loadhistory("myfile")#加载.Rhistory文件中的命令
save(a,file="myfile2")#保存对象

options()#显示当前选项
options(digits = 3)


#储存包的目录成为库(library)
.libPaths()#library的位置
library()#库中有哪些包
#R中默认包:base datasets utils grDevices graphics stats methods

search()                #已加载的包
installed.packages()    #已安装的包

install.packages("glue")
update.packages()
update.packages(ask = FALSE)#一次性更新所有包
library(name)
#R包安装更新:https://www.jianshu.com/p/b625ca4dc3bd





#########################################################

#工作空间workspace:储存着用户应以的对象(向量 矩阵 函数 数据框 列表)
#工作目录working directory:R用来读取文件、保存结果的默认目录
getwd()#查看工作目录
setwd("D:/data")     #正斜杠 (R中反斜杠为转义符)
setwd("D:\\data")#两个反斜杠也可
#dir.create()可创建新目录 然后使用setwd()指向新目录

ls()#显示当前对象
rm(zz)#移除对象

#画直方图
x<-runif(20)
hist(x)


source("filename")#在当前会话中执行一个脚本(一个包含了R语句的文件)
#重定向输出文本
sink("filename", append = TRUE, split = TRUE)#将输出定向到文件filename中(默认覆盖已有文本内容)。append=TRUE文本追加到文件后,而不是覆盖。split=T可将结果同时发送到屏幕和输出文件中。到

#重定向输出图片
dev.off()#将输出返回到终端 
bmp("filename.bmp")
jpeg("filename.jpg")
pdf("filename.pdf")
png("filename.png")


######################################################
#本章例子
#Arthritis
help.start()
install.packages("vcd")#用于可视化类别数据的包
library(vcd)
help(package="vcd")
help(Arthritis)
Arthritis#查看数据集内容
data("Arthritis")#将数据集导入环境中,但不会显示内容
example("Arthritis")#查看数据集的自带示例

ch2 数据结构

#向量
a<-c(1,2,4)
b<-c("one","two","three")
c<-c("TRUE","FALSE")
d<-c(2:6)#2 3 4 5 6

#>>>>>>>>>>>>>>>>>>矩阵>>>>>>>>>>>>>>>>>>>>

##m<-matrix(vector,nrow = 3,ncol = 4,byrow = FALSE,dimnames = list(char_vector_rownames,char_vector_colnames))#默认一个字符串放进来按列排列

##生成矩阵都是先有一个向量,然后放进matrix函数里
y<-matrix(1:20,nrow = 5)

##dimnames
rnames<-c("R1","R2","R3","R4")
cnames<-c("C1","C2","C3","C4","C5")
mymatrix<-matrix(1:20,nrow = 4, byrow = T, dimnames = list(rnames,cnames))

##或者用函数加
rownames(y)<-c("a","b","c","d","e")
row.names(y)<-c("a","b","c","d","e")#两种都可

y[1,c(2,3)]
y[1:3,]
mymatrix["a"]#NA #矩阵不能用行列名索引
#>>>>>>>>>>>>>>>>>>数组>>>>>>>>>>>>>>>>>>>

#myarray<-array(vector, dimensions, dimnames=list(行名向量,列名向量,层名向量))
#数组是矩阵的2.0版,生成数组也是需要先有一个向量c(a,b,c,d,e)
dim1<-c("A1","A2")
dim2<-c("B1","B2","B3")
dim3<-c("C1","C2","C3","C4")

myarray<-array(1:24,c(2,3,4),dimnames = list(dim1,dim2,dim3))

#>>>>>>>>>>>>>>>>>>>数据框>>>>>>>>>>>>>>>>>>>>

##mydataframe<-data.frame(col1,col2,col3)
##矩阵的生成是一列一列的向量组成的

##(1)先定义向量,在把他放进去
patientID<-c(1,2,3,4)
age<-c(24,34,55,34)

mydataframe<-data.frame(patientID,age)

##(2)直接生成,列名=c(a,v,s,g,d)
mydataframe2<-data.frame(diabetes=c("Type1","Type2","Type3","Type4"),
                        status=c("Poor","Improved","Excellent","Poor"))

class(mymatrix)# "matrix"
class(myarray)#"array"
class(mydataframe)#"data.frame"

##索引
mydataframe[1:2]#一二列
mydataframe[c("patientID","age")]
mydataframe$patientID#$选取数据框中的列

##生成列联表
table(mydataframe2$diabetes,mydataframe2$status)

#>>>>>>>>>>>>>attach detach with>>>>>>>>>>>>>>>>>>>>>>

#attach将 数据框 添加到搜索路径中。R在遇到一个变量名后将检查搜索路径中的数据框
#在变量名前都键入一次dataframe2$比较繁琐,不妨使用这三个函数简化代码

attach(mtcars)
plot(mpg,disp)
detach(mtcars)



with(mtcars,
  plot(mpg,disp)
)

#多条语句加个花括号就行
#with的局限性在于,赋值仅在此函数括号内生效
with(mtcars,{
  stats<-summary(mpg)
  stats
})
stats#Error: object 'stats' not found

#>>>>>>>>>>>>>>>>>>> factor >>>>>>>>>>>>>>>>>>>>

#把一个向量变成factor


#普通因子
sex<-c("Male","Female","Female","Male")
sex<-factor(sex,levels = c(1,2),labels = c("Male","Female"))

#有序因子
status<-c("Poor","Improved","Excellent","Poor")
status<-factor(status,ordered = T, levels = c("Poor","Improved","Excellent"))#order=T: status是有序型变量#1=Poor 2=Improved 3=Excellent

attributes(status)






#list
##R不提供多行注释或块注释功能。必须以#作为多行注释每行的开始。

#>>>>>>>>>>>>>>>>> 本章例子 >>>>>>>>>>>>>>>>>
patientID<-c(1,2,3,4)
age<-c(25,34,55,66)
diabetes<-c("Type1","Type2","Type1","Type1")
status<-c("Poor","Improved","Excellent","Poor")

diabetes<-factor(diabetes)
status<-factor(status,ordered = T)

patientdata<-data.frame(patientID,age,diabetes,status)
str(diabetes)#Factor w/ 2 levels "Type1","Type2": 1 2 1 1
str(patientdata)
summary(patientdata)




a<-c(1,2,3,4,NA)
sum(a)#NA








#>>>>>>>>>>>>>>>>> 导入数据 >>>>>>>>>>>>>>>>>>>>>>>>>

#直接输入
mydata<-data.frame()
mydata<-edit(mydata)
fix(mydata)#更简洁的写法


#导入csv
##带分隔符的文本文件的导入。

##mydataframe3<-read.table(file,header = T, sep = ",", row.names = c("1","2"),col.names = c("a","v","g"), na.strings = c("-9","?"),colClasses = c("numeric","character","numeric"),skip,stringsAsFactors = F)
##header=T 文件的第一行为变量名。sep=","文件是以逗号分隔的。colClasses将每一列读为什么数据类型。skip跳过的行数目(跳过开头注释)。stringAsFactors=F不要转化为因子
##row.names指定一个或多个行标记。col.names指定一个包含变量名的字符向量,若未指定,变量会以V1 V2,。。。命名
#把-9和?用NA代替

data<-read.table("student.csv",header = T, row.names = "StudentID",sep = ",",colClasses = c("character","character","character","numeric","numeric","numeric"))

?file

#导入excel
library(xlsx)
setwd("D:/data")
data2<-read_xlsx("Numbers2.xlsx",1)#sheet1
#另外一些包 XLConnect openxlsx 

#Rfacebook导入Facebook数据 Rflickr获取Flicker数据 twitteR获取Twitter数据

#导入sav (spss)
library(Hmisc)
data3<-spss.get("li2.1.sav",use.value.labels = T)#让函数带有值标签的变量导入为R中水平对应相同的因子

#导入stata 
library(foreign)
data4<-read.dta("mydata.dta")


#>>>>>>>>>>>>处理数据对象的函数>>>>>>>>>>>>>>
#mode(object)#某个对象的模式

#length(object)#元素/成分的数量

#cbind(ob1,ob2)#按列合并对象
#rbind(ob2,ob3)

ch3 图形初阶

data(mtcars)


#>>>>>>>>>>>>>>>>>>一个例子>>>>>>>>>>>>>>>>>>>>>.

pdf("mpgonweight.pdf")#已经创建了一个空的pdf 接下来往进画东西 中途是没法打开看的
attach(mtcars)
plot(wt,mpg)
abline(lm(mpg~wt))#为散点图添加一条最优拟合曲线
title("Regression of MPG on Weight")
detach(mtcars)
dev.off()#必须到这步完了以后 pdf才能打开

#>>>>>>>>>>>>>>>>>>>> plot() >>>>>>>>>>>>>>>>
#plot的x y 是向量

a<-c(20,30,40,45,60)
b<-c(16,20,27,40,60)
plot(a,b,type="b")     #a横轴 #type="b"同时画点和线

dev.new()#重新打开一个图形窗口 dev.next() dev.prev() dev.set() dev.off()查一下意思

#>>>>>>>>>>>>>>>> par()设置图形参数>>>>>>>>>>>>>

#通过修改图形参数来自定义一幅图的特征(字体 颜色 坐标轴 标签)
# par()函数可以用来指定这些选项
#并不是所有高级绘图函数都允许指定全部可能的图形参数 需要查看帮助?plot ?hist ?boxplot

#pch: 点的类型
#cex: 点的大小(相对默认大小的缩放倍数,1表示为默认大小)
#lty: 线的类型
#lwd: 线的宽度(也是倍数)

#col: 点21~25可以用此设定 边界颜色
#bg: 。。。。。。。。。。。填充色


##(1)方法一
opar<-par(no.readonly = T)    #->保存原图形参数
par(lty=2,pch=17)
plot(a,b,type="b")#实三角
par(opar)                     #->还原图形参数

##(2)方法二
plot(a,b,type="b",lty=2,pch=21,bg="red",col="black")#点用红色填充 边界颜色为黑色

#>>>>>>>>>>>>>>>>> 颜色>>>>>>>>>>>>>>>>>>>

#参数
## col: 绘图颜色。某些函数(lines pie)可以接受一个颜色值向量并自动循环使用(如画三条线,c("red","blue"),第一条红第二条蓝第三条是红)
## col.axis: 坐标刻度的颜色
## col.lab: 坐标标签的颜色
## col.main: 标题颜色 col.sub副标题颜色
## fg: 图形的前景色
## bg: 图形的背景色

#颜色的表示方式:col=1 col="white” col="#FFFFFF" col=rgb(1,1,1) col=hsv(0,0,1)色相-饱和度-亮度值

colors()#查看所有颜色,如: "white" "aliceblue" "antiquewhite"  

#创造连续向量的函数
rainbow(n=5)
heat.colors(10)
terrain.colors(10)
topo.colors(10)
cm.colors(10)# "#80FFFFFF" "#99FFFFFF" "#B3FFFFFF" "#CCFFFFFF" "#E6FFFFFF" "#FFE6FFFF" "#FFCCFFFF" "#FFB3FFFF" "#FF99FFFF" "#FF80FFFF"


#创建颜色配对(配好的一组风格的颜色)
library(RColorBrewer)
display.brewer.all()#显示风格组
brewer.pal.info#显示每组颜色的信息

mycol<-brewer.pal(7,"BrBG")#从BrBG组拿出7种颜色(不是按顺序拿的)
barplot(rep(1,7),col=mycol)

mycol2<-rainbow
pie(rep(1,10),col=mycol2,labels = mycol2)#labels别拼错 哭了

#>>>>>>>>>>>>>>>>>>> 文本 >>>>>>>>>>>>>>>>>>>>>>

#文本大小
## cex: 文本大小(倍数)
## cex.axis: 坐标刻度大小(倍数)
## cex.lab: 坐标标签大小(倍数)
## cex.main: 标题大小(倍数)cex.sub副标题

#字体
## font: 字体。整数(1常规 2粗体 3斜体 4粗斜体 5符号字体)
## font.axis: 
## font.lab: 
## font.main   font.sub 一样套路

#字号
## ps: 磅值(文字大小= ps * cex)
## family: 字体族(serif衬线 sans无衬线 mono等宽)
par(font.lab=3,cex.lab=1.5,font.main=4,cex.main=2)#以后画出的图都是这种样式

#>>>>>>>>>>>>>>>>>>> 画布大小 >>>>>>>>>>>>>>>>>>

## pin: 图形宽和高(英寸)
## mai: figure margin(下左上右)英寸
## mar: figure margin(。。。。)英分。默认c(5,4,4,2)+0.1
par(pin=c(3,3),mai=c(0.5,0.5,0.5,2))#pin为什么看不到效果?好像大小没变
plot(a,b,type="b")


#>>>>>>>>>>>>>>>>> 标题 >>>>>>>>>>>>>>>>>

##例子
##一些高级绘图函数(plot hist boxplot)可以自行设定坐标轴和文本标注
par(opar)
plot(a,b,type="b",
     col="red",lty=2,pch=2,lwd=2,
     main="test",sub="test_sub",
     xlab="Dosage",ylab="Drug regression",
     xlim=c(0,60),ylim=c(0,70))
#某些高级绘图函数如果包含默认的标题或标签 可通过在函数内部或者par()添加ann=FALSE来移除他们



#title
##这个函数不会覆盖原来画好的图像
plot(a,b)
title(main="标题", col.main="red",
      sub="副标题", col.sub="blue",
      xlab="x轴", ylab="y轴",
      col.lab="green", cex.lab=0.75)


#>>>>>>>>>>>>>>>> 坐标轴 >>>>>>>>>>>>>>>>>>>>>>>>>>
#axis自定义坐标轴
x<-1:10
y<-x
z<-10/x
plot(x,y,type="b",yaxt="n",ann=FALSE)#yaxt="n"禁用y轴刻度 ann=FALSE禁用所有标题和标签
axis(2,at=x+1,labels = x+1,col.axis="red",las=2)#试一下,pos = 0.5

lines(x,z,type="b",col="blue")
axis(4,at=z,labels = round(z,digits = 2),col.axis="blue",las=2,cex.axis=0.7,tck=-0.05)#试一下,las=0, tck=1
## axis(side,at=, labels=, pos=, lty=,col=,las=,tck=,...)
## side: 在哪边绘制坐标轴(1234 下左上右)
## at: 在哪个位置绘制(at=x在x的位置绘制;at=x+1在x+1的位置绘制)
## labels: 刻度是什么 (Null,默认绘制at中的值)
## pos: 坐标轴线绘制位置的坐标(即与另一条坐标轴相交位置的值)?
## lty: 线条类型 col: 线条和刻度线颜色
## las: 0,刻度平行于坐标轴; 2,垂直于(刻度是站着的还是跌倒的)
## tck: 刻度线长度(负值在图形外侧,正值在内测,0表示禁用刻度,1表示绘制网格线)默认-0.01


#>>>>>>>>>>>>>>>> 次要刻度线 >>>>>>>>>>>>>>>>>>

#添加次要刻度线
library(Hmisc)
minor.tick(nx=2,ny=2,tick.ratio = 0.5)#nx=2 x轴两条主刻度线分2段; tick.ratio=0.5 次要刻度线长度是主刻度线的0.5倍
## 坐标轴被自定义过,次要刻度线添加不上去?


#>>>>>>>>>>>>>>> 添加直线>>>>>>>>>>>>>>>>>>>>
# abline添加直线
plot(a,b,type="b")
abline(h=c(30,40,50),,v=c(40,50,60),lty=,col="yellow")


#>>>>>>>>>>>>>>>> 图例 >>>>>>>>>>>>>>>>>>>>>>>

# legend 图例
legend("topleft",inset = 0.05,title = "图例标题",legend=c("A","B"),lty=c(1,6),pch=c(15,17),col=c("red","blue"))
##location: 使用关键字(bottom bottomleft left topleft top topright right bottomright center)。使用关键字的同时可以用inset= 来移动距离(inset值在0~1之间,是相对于左上顶点的距离,表示图像大小的一个分数)
##          执行locator(1),通过鼠标单击给出图例位置
##title: 图例的标题
##legend: 

##真好玩系列-点到哪里放哪里
legend(locator(1),title = "图例标题",c("A","B"),lty=c(1,6),pch=c(15,17),col=c("red","blue"))


#>>>>>>>>>>>>>> text mtext文本标注>>>>>>>>>>>

#文本标注
plot(a,b,type="b")

## text(location,"text", pos) pos:文本相对于location点的方位(有时候被其他文本挡住时可以调方位 下左上右),同时指定offset= 作为偏移量
text(23,23,"morenziti",pos=4,offset = 5)
#text(30,30,family="mono","mono")
#text(30,40,family="serif","serif")

## mtext(side,"mtext",line=n) line=n相对边缘空几行
mtext(side=4,"mtext",line = 0.5)#只能在下左上右添加text


##用向量添加text
attach(mtcars)
plot(wt,mpg)
text(wt,mpg,row.names(mtcars),pos=4)#在2.62,21的位置 写“Mazda RX4”
detach(mtcars)


#>>>>>>>>>>>> par() layout()分割画布 >>>>>>>>>>> 

#分割画布
#par(mfrow=c(nrows,ncols))
par(mfrow=c(2,3))#mfrow=c(nrows,ncols)按行填充 行数为nrows 列数为ncols的矩阵。 mfcol=c(nrows,ncols)

attach(mtcars)
plot(wt,mpg)
barplot(c(1,1,1,2,2,2,3,3))
boxplot(wt)                   #箱线图
hist(wt)          #高级函数hist()有默认标题
pie(rep(1,5))
hist(wt,ann=F)    #或main=""   ann=FALSE禁用所有标题和标签
detach(mtcars)

#layout(matrix)
layout(matrix(c(1,1,2,3),2,2,byrow = T),widths = c(2,1),heights = c(1,2))#第一行放的都是1(第一张图),第二行放2(第二张图)和3(第三张图),宽度(左:右=2:1),高度(上:下=1:2)
attach(mtcars)
hist(wt)
hist(mpg)
hist(disp)


#复合图形
par(opar)
par(fig=c(0,0.8,0,0.8))
plot(mtcars$wt,mtcars$mpg)
par(fig=c(0,0.8,0.55,1),new=T)        #new=T 下一副图不覆盖上一副
boxplot(mtcars$wt,horizontal = T,axes=FALSE)
par(fig=c(0.65,1,0,0.8),new=T) 
boxplot(mtcars$mpg,axes=FALSE)        #axes=FALSE 不要刻度
mtext("标题",side = 3,outer = TRUE, line=-6)#这个-6是从区域边框开始算的,前面的lines是从图形边缘黑线算的?

ch4 数据预处理

# 为数据框创建新变量
## 方法1
mydata$sum<-mydata$x1+mydata$x2

## 方法2
attach(mydata)
mydata$sum<-x1+x2
detach(mydata)

## 方法3
mydata<-transform(mydata,sum=x1+x2)


#>>>>>>>>>>>>> transform within>>>>>>>>
#http://blog.sina.com.cn/s/blog_6cb445270102zgk8.html
##transform用来对dataframe修改
## 增加一列
transform(data,newcol=c(a,b,c))

## 去掉一列
transform(data,somecol=NULL)

## 计算一列
transform(data,newcol=col1+col2)



##逻辑运算符:< > <= >= != !x x|y x&y isTRUE(x)

##within修改数据框
df<-within(df,{
           newcol<-NA
           newcol[age>75]<-"Elder"
           newcol[age>=55&age<=75]<-"Middle Aged"
           newcol[age<55]<-"Young"
})

#>>>>>>>>>>>> 重命名列名 >>>>>>>>>>>>

names(df)[2]<-"v2"

library(plyr)
rename(df,c(oldname="newname",oldname="newname2"))#这个函数有点迷 不知道原表到底改了没改 还是用names()就比较好


#>>>>>>>>>>>>>> 缺失值 >>>>>>>>>>>>>>>>

#关于缺失值,2点需要注意:
## 1 缺失值不可比较,无法用运算符来检测缺失值是否存在,只能使用处理缺失值的函数。x == NA 结果永远不会为TRUE
## 2 R不把无穷或无意义(分母为0)的数记成NA。如:5/0记为Inf, sin(inf)记为NaN(not a number)
is.infinite()
is.nan()


##is.na()是作用在一个对象上的 返回相同长度的对象
y<-c(1,2,3,NA)
is.na(y)
is.na(df[,2:4])

##使某些值为NA
df$age[df$age==99]<-NA

##移除缺失值进行计算
s<-sum(x,na.rm = TRUE)

na.omit(df)       #删除有缺失值的 行



#>>>>>>>>>>> 转化为日期 >>>>>>>>>>>>>>>>>>

## 具体格式书p76

##默认yyyy-mm-dd
date1 <- as.Date(c("2020-04-01","2020-04-02"))
date1           #"2020-04-01" "2020-04-02"
class(date1)    #Date

##指定
date2<-as.Date(c("04/01/2020","04/02/2020"),"%m/%d/%Y")
date2          #"2020-04-01" "2020-04-02"
class(date2)

##判断系统时间
Sys.Date()    #"2020-04-01"
Sys.time()    #"2020-04-01 17:11:47 CST"
date()        #"Wed Apr 01 17:12:21 2020"

##按一定格式输出
today<-Sys.Date()
format(today,format="%B %d %Y")#"四月 01 2020"
format(today,format="%A")#"星期三"

## R 中日期是按1970.1.1为界分正负,日期可以进行运算
startdate<-as.Date("2000-01-01")
enddate<-as.Date("2020-04-01")
days<-enddate-startdate
days          #Time difference of 7396 days

difftime(enddate,startdate,units = "weeks")#Time difference of 1056.571 weeks

##日期转化为字符型向量
strDates<-as.character(startdate)


#>>>>>>>>>>>> 类型转换 >>>>>>>>>>>>>
is.numeric()        as.numeric()
is.character()      as.character()
is.vector()         as.vector()
is.matrix()         as.matrix()
is.data.frame()     as.data.frame()
is.factor()         as.factor()
is.logical()        as.logical()

#>>>>>>>>>> 排序 >>>>>>>>>>>>>>>>
## 默认升序
x<-c(3,1,6,32,7,2,9)

## 返回索引
order(x)       #2 6 1 3 5 7 4

## 返回值
sort(x)        #1  2  3  6  7  9 32
x              #3  1  6 32  7  2  9

ordered_data <- data[order(data$age),]
ordered_data2 <- data[order(data$gender,data$age),]

attach(data)
ordered_data3 <- data[order(gender,-age),]
detach(data)
v

#>>>>>>>>>>>>> 合并 >>>>>>>>>>>

#dataframe内部指定列时不能用“<-”,必须用“=”

df1<-data.frame(id=c(1,2,5,6,8,9),country=c("a","b","d","g","h","k"),age=c(34,66,27,77,56,45))
df2<-data.frame(id=c(2,3,5,6,7,8),country=c("b","d","g","l","r","w"),gender=c("F","M"))

#merge()
#https://blog.csdn.net/neweastsun/article/details/79435271写的特别好
total<-merge(df1,df2,by = "id")#只取两个表的共同id 取交集展示
total2<-merge(df1,df2,by = c("id","country"))

##用all参数控制内联结 外联结 左外 右外

#cbind() 
##合并 矩阵或数据框
#要求:有相同行数,顺序相同

#rbind()
## 要求:有相同变量(可以删除多余变量,或将某列设为NULL)


#>>>>>>>>>>>> 选取变量 >>>>>>>>>>>>

#dataframe是通过df[rowindices, columnindices]来访问
df<-iris
df[,c(1:3)]

#从中选取一些变量
df[c("Sepal.Length","Sepal.Width","Petal.Length")]
df["Sepal.Length"]

#>>>>>>>>>> 剔除变量 >>>>>>>>>>>>>>>

v_logical<-names(df) %in% c("Sepal.Length","Sepal.Width")
df<-df[!v_logical]

#>>>>>>>>>> 选取观测 >>>>>>>>>>>>.

newdata<-women[1:3,]
newdata2<-women[women$height>50&women$weight<120]

#跟日期有关的选取
leadership$date<-as.Date(leadership$date,"%m/%d/%y")
startdate<-as.Date("2009-01-01")
enddate<-as.Date("2009-10-31")
newdate<-leadership[which(leadership$date>=startdate&leadership$date<=enddate)]#which函数可以得到索引

#subset()函数这么好!
newdata<-subset(data,age>=35 | age<24,select = c(q1,q2,q3,q4))#选取了q1~q4几个变量进行展示
##q1:q4也行


#随机选取训练集
testdata <- data[sample(1:nrow(data),100,replace = FALSE),]


#用SQL语句选
##使用sqldf()可以在数据框上使用SQL中的SELECT语句
library(sqldf)#同济镜像
sqldf("select * from mtcars where carb=1 order by mpg",row.names=TRUE)#row.names=TRUE将原始数据框中的行名延续到了新数据框

sqldf("select avg(mpg) as avg_mpg,avg(disp) as avg_disp,gear from mtcars where cyl in (4,6) group by gear")


ch5 各类函数


#>>>>>>>>>>>>>>>>>>>>> 数学函数 >>>>>>>>>>>>>>>>>>>>>>>

abs(x)
sqrt(x)

ceiling(x) #向上取整
floor(x)   #向下取整
trunc(x)   #向0方向取x中的整数部分

round(x,digits = 2)    #小数位保留几位数
signif(x,digits = 2)    #连带整数位保留几位

cos(x) sin(x) tan(x)
acos(x) asin(x) atan(x)     #反余弦
cosh(x) sinh(x) tanh(x)
acosh(x) asinh(x) atanh(x)

log(x,base=n)  #以n为底
log(x)         #自然对数(以e为底)
log10(x)       #常用对数(以10位底)
exp(x)

#>>>>>>>>>>>>>>>>>>>> 统计函数 >>>>>>>>>>>>>>>>>>>>>>>>>

mean(x)
median(x)
sd(x)#样本标准差(分母除的是样本量-1)
var(x)
mad(x)    #绝对中位差
quantile(x,probs = 0.75)    #x是一个向量
range(x)
sum(x)
diff(x,lag = n)    #滞后差分 滞后几项(x是一个向量 返回也是一个向量)
min(x)
max(x)

scale(x,center = TRUE,scale=TRUE)#center中心化 scale标准化

#scale函数
## scale是对矩阵或数据框的指定列进行均值为0、标准差为1的标准化
newdata<-scale(mydata)

##进行任意均值和标准差的标准化
newdata2<-scale(mydata)*sd + m

##对指定的列进行
newdata2<-transform(mydata,x=scale(x)*10+50)


#>>>>>>>>>>>>>>>>>>>>> 概率分布 >>>>>>>>>>>>>>>>>>>>>>>>>>>
#正态分布
dnorm#密度函数
pnorm#分布函数
qnorm#分位数函数
rnorm#随机数生成函数

x<-pretty(c(-3,3),30)#创建美观分割点,30个区间
y<-dnorm(x)
plot(x,y,type="l")

#生成0到1上均匀分布的为随机数
set.seed(100)
runif(10)

#生成多元正态
##需要均值向量和协方差阵
library(MASS)
mean<-c(230.7,146.7,3.6)
sigma<-matrix(c(15360.8,6721.2,-47.1,
                6721.2,4700.9,-16.5,
                -47.1,-16.5,0.3),nrow=3)
mvdata <- mvrnorm(100,mean,sigma)
mvdata <- as.data.frame(mvdata)
names(mvdata)          #"V1" "V2" "V3"



#>>>>>>>>>>>>> 字符处理函数 >>>>>>>>>>>>>>>>>>>>>

#https://www.cnblogs.com/awishfullyway/p/6601539.html这篇包括了好多函数

x <- c("ab","deg","defrs")
nchar(x)               # 每个字符串的长度
substr(x,2,4)          # "b"   "eg"  "efr" 字符串替换或提取


#grep()
## 在x中搜索某种模式
## http://blog.sina.com.cn/s/blog_908af8900101hgnv.html
## https://blog.csdn.net/piaoyu94/article/details/76416355
## grep(pattern, x, ignore.case = FALSE, perl = FALSE, value = FALSE, fixed = FALSE, useBytes = FALSE, invert = FALSE)
## value=T输出的是字符串 F输出的是索引
x<-c(310,456,311,431,435,534,312,313,320,321,322,323,314,324,317,3231)
grep("^3",x,value = T)#以3开头
grep("4$",x,value = T)#以4结尾
grep("3.2",x,value = T)#以3开头,以2结尾
grep("*31",x,value = T)#含有31
grep("3.*1",x,value = T)#含有3和1
grep("3|1",x,value = T)#含有3或1
grep("[1]",x,value = T)#含有1


#sub()
## 找到pattern,用replacement替换
## sub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE,fixed = FALSE, useBytes = FALSE)


#strsplit()
## strsplit(x, split, fixed = FALSE, perl = FALSE, useBytes = FALSE)

#paste()
paste("x",1:3,sep = "")#"x1" "x2" "x3"
paste("x",1:3,sep = "M")#"xM1" "xM2" "xM3"


toupper("abc")#"ABC"
tolower("ABC")#"abc"


#>>>>>>>>>>>>>>>>>>>>> 其它 >>>>>>>>>>>>>>>
x<-c(1,2,3,4,"abc")
length(x)       #5
seq(1,10,2)     #1 3 5 7 9
rep(1:3,3)      #1 2 3 1 2 3 1 2 3
cut(x,2)#将连续性变量x分割为有n个水平的因子
pretty(x,n)#将连续型变量x分割为n个区间
cat()




#>>>>>>>>>>>>> apply() >>>>>>>>>>>>>

#apply(): 函数->矩阵、数组、数据框的任何维度
#apply(x, MARGIN, FUN, ...) x为数据对象,Margin为维度下标,FUN是函数,...表示FUN的参数。margin=1表示行,margin=2表示列
set.seed(11)
m<-matrix(rnorm(30),nrow=6)#标准正态分布随机数
result<-apply(m,1,mean)
class(result)#"numeric"

apply(m,1,mean,trim=0.2)#只计算中间60%数据的均值

#lapply() sapply(): 函数->列表



#>>>>>>>>>> 例子 >>>>>>>>>>>>>
options(digits = 2)
Student<-c("John Davids","Angela Williams","Bullwinkle Moose",
           "David Jones","Janice Markhammer","Cheryl Cushing",
           "Reuven Ytzrhak","Greg Knox","Joel England","Mary Rayburn")
Math<-c(502,600,412,358,495,512,410,625,573,522)
Science<-c(95,99,80,82,75,85,80,95,89,86)
English<-c(25,22,18,15,20,28,15,30,27,18)
roster<-data.frame(Student,Math,Science,English,stringsAsFactors = F)

z<-scale(roster[,2:4])
score<-apply(z, 1, mean)
roster<-cbind(roster,score)#dataframe和vector

y<-quantile(score,c(0.8,0.6,0.4,0.2))
roster$grade[score>=y[1]]<-"A"
roster$grade[score<y[1]&score>=y[2]]<-"B"
roster$grade[score<y[2]&score>=y[3]]<-"C"
roster$grade[score<y[3]&score>=y[4]]<-"D"
roster$grade[score<y[4]]<-"F"

name<-strsplit(roster$Student," ")
Lastname<-sapply(name,"[",2)#"["是一个可以提取某个对象一部分的函数,在这里它是用来提取列表name各成分中第一个或第二个元素的。
Firstname<-sapply(name, "[",1)
roster<-cbind(Firstname,Lastname,roster[,-1])#dataframe和vector

roster<-roster[order(Lastname,Firstname),]#order返回的是索引



#>>>>>>>>>>>>>>>> 控制流 >>>>>>>>>>>>..
for(i in 1:10)print(i)


i<-10
while(i>0){print("Helloworld");i<-i-1}


if(i<0) {
  print("a")
}else if(i>0&i<1){
  print("b")
} else {
  print("c")
}#else不能放下一行


ifelse(i>0,"positive","negative")


switch("Tom",
       Tom="lawyer",
       Mike="Teacher",
       Karl="Student")#lawyer


#>>>>>>>>>>> 分组统计aggregate() >>>>>>>>>>
  
##https://www.cnblogs.com/ljhdo/archive/2017/11/04/5180319.html
diamonds#library(tidyverse)
aggregate(price~cut,diamonds,mean)#单个分组变量
aggregate(price~cut+color,diamonds,mean)#多个分组变量
aggregate(cbind(price,carat)~cut,diamonds,mean)#多个聚合变量
aggregate(cbind(price,carat)~cut+color,diamonds,mean)#多个分组变量多个聚合变量

aggregate(cut~color,diamonds,length)#分组计数
aggregate(cut~color,diamonds,function(x) length(unique(x)))#唯一计数


#>>>>>>>>>> 融合melt() >>>>>>>>>>>>>>>

install.packages("reshape2")
library(reshape2)
originaldata<-data.frame(ID=c(1,1,2,2),Time=c(1,2,1,2),X1=c(5,3,6,2),X2=c(6,5,1,4))

meltdata<-melt(originaldata,id=c("ID","Time"))#用ID Time唯一确定观测


#>>>>>>>>>>> 重铸dcast() >>>>>>>>>>>>>
#书p107有副图很清晰
mydata<-data.frame(ID=c(1,1,2,2),Time=c(1,2,1,2),X1=c(5,3,0,2),X2=c(6,5,1,4))#原表
md<-melt(mydata,id=c("ID","Time"))#融合后的数据

#进行整合
dcast(md,ID~variable,mean)
dcast(md,Time~variable,mean)
dcast(md,ID~Time,mean)

#不进行整合
dcast(md,ID+Time~variable)
dcast(md,ID+variable~Time)
dcast(md,ID~variable+Time)

你可能感兴趣的:(R,r语言)