R语言用高深的理论作为支撑、用简捷的语法作为工具、用清晰明了的结论作为结果。
http://www.r-project.org/>>“Download”>>“CRAN”>>“Download R for Windows”>>“base”
https://www.rstudio.com/>>“Download”
Tool>>Global Options>>packages>>CRAN mirror>>选择距离较近的镜像
Help>>R Help
1.创建向量
同一个向量中的数据类型必须保持一致
#创建向量
c(1,2,3,4)
c("a","b","c","d")
c(T,T,F,F)
2.向量索引(下标索引)
下标索引、which函数、subset函数、match函数、%in%
#向量索引
## 下标索引
a<-c(5,6,7,8) #创建向量
a
a[1] #取向量第一个元素
a[-1] #取除了第一个元素外的所有元素
a[c(1:3)] #取下标为1到3的元素
a[c(1,3)] #取下表为1和3的元素
## which函数(获得下标)
which(a==6) #找出向量a中等于6的元素所在下标
which(a>6 & a<=8) #找出向量a中大于6并且小于等于8的元素所在下标
which.max(a) #找出向量中最大元素所在的下标
which.min(a) #找出向量中最小元素所在的下标
## subset函数(获得元素)
subset(a,a>6&a<=8)
## match函数
a<-c(11,11,12,12,13,13,14,14)
#符合的按顺序标记,不匹配的NA
match(a,c(11,13))
#符合的按顺序标记,不匹配的标记为0
match(a,c(11,13),nomatch=0)
#符合的按顺序标记,忽略13
match(a,c(11,13),nomatch=0,incomparables=13)
## %in% #判断对象是否包含某项数据,存在返回T,否则返回F
a<-c(11,11,12,12,13,13,14,14)
#查看11和15是否在向量a中出现
c(11,15) %in% a
3.向量编辑
#1)向量扩展
a<-c(1,2)
b<-c(3,4)
ab<-c(a,b)
ab
ad<-c(a,c(7,8))
ad
#2)向量元素修改
a<-c(1,2,3,4)
a[2]<-5
a
#3)向量元素删除
a<-c(1,2,3,4)
a[-3]
#4)去除向量内重复元素
a<-c(1,3,2,5,4,3,2,1,8,3,9,1)
unique(a)
#5)给向量元素命名
x <- c(2.1, 4.2, 3.3, 5.4)
yy<-setNames(x,letters[1:4])
yy
names(yy)
yy["a"]
4.向量排序
rev():依据向量下标倒排序(按下标倒放)
sort():依据向量中实际数值的大小排序(升序)
a<-c(1,3,2,5,4,3,2,1,8,3,9,1)
rev(a)
sort(a)
sort(a,decreasing=TRUE) #降序
5.向量间的操作
#1)比较向量大小
aa<-c(1,2,3,4)
bb<-c(2,1,2,5)
cc<-pmin(aa,bb) ##把向量对应位置里最小的数据集合成一个新的向量
cc
dd<-pmax(aa,bb) ##把向量对应位置里最大的数据集合成一个新的向量
dd
#2)向量集合运算
a<-c(1,3,4,6,2)
b<-c(7,8,3,2)
intersect(a,b) ##求交集
union(a,b) ##求并集
setdiff(a,b) ##求差集 注意a、b的位置
#3)判断两个集合的包含关系
a<-c(1,2,3,4,5,7)
c<-c(1,2,6)
all(c%in%a)
6.创建等差序列和重复序列
#1)创建等差序列 seq(from第一项数值,to最后一项数值,by步长,length.out产生序列长度)
#生成一个首项1,末项为-9,默认步长为-1的等差序列
seq(1,-9)
#生成一个首项1,末项为-10,步长为-2的等差序列
seq(1,-10,by=-2)
#生成一个首项1,步长为3,长度为5的等差序列
seq(1,by=3,length.out=5)
#2)创建重复数据 rep(x重复的对象,times重复次数,length.out产生序列的长度,each每个元素的重复次数)
#重复序列两次
rep(1:3,2)
#每个元素重复3次
rep(1:3,each=3)
#对应元素重复相应的次数
rep(1:3,c(1,2,1))
#每个元素重复2次,输出长度为4
rep(1:3,each=2,length.out=4)
#每个元素重复3次,并且反复3次上述行为
rep(1:3,each=3,times=3)
2.3.3 矩阵和数组
# 1)创建矩阵matrix(data矩阵元素,nrow行数,ncol列数,byrow按行填充,dimnames以字符向量表示)
data<-c(1:10)
a<-matrix(data,ncol=2,nrow=5)
a
a<-matrix(data,ncol=2,nrow=5,byrow=T)
a
data<-c(1:10)
a<-matrix(data)
#设置行数为2,列数为5
dim(a)<-c(2,5)
a
data<-c(1:10)
a<-matrix(data,ncol=2,nrow=5,dimnames=
list(c("r1","r2","r3","r4","r5"),c("c1","c2")))
a
#row函数和col函数
a
row(a)
col(a)
# 2)矩阵索引
# a["r3","r2"]=a[3,2]
# a[[8]]第八个元素
a<-matrix(c(1:10),ncol=2,nrow=5,dimnames=list(c("r1","r2","r3","r4","r5"),c("c1","c2")))
a[[8]]
#4)使用单一维度选取
data<-c(1:10)
a<-matrix(data,ncol=2,nrow=5,dimnames=list(c("r1","r2","r3","r4","r5"),c("c1","c2")))
a
#选取3~5行的数据
a[c(3:5),]
# 3)矩阵编辑
#1)矩阵合并 行数或者列数相同
a<-matrix(1:10,nrow=5)
a
b<-matrix(1:15,nrow=5)
b
#矩阵横向合并
cbind(a,b)
#2)删除矩阵
a[-1,] #删除第一行数据
a[,-1] #删除第一列数据
#3)反转矩阵的行或列
a[rev(1:nrow(a)),] #反转矩阵a的行
a[,rev(1:ncol(a))] #反转矩阵a的列
#4)选取矩阵子集
a<-matrix(1:12,4,3)
a[1:2,2]
a[1:2,2,drop=FALSE]
#5)选取满足条件的行或列
a[a[,1]<3,]
#6)用矩阵内的元素值作为下标
#手动输入矩阵元素,手动输入18个数值,然后按两下回车
mat<-matrix(scan(),ncol=3,byrow=TRUE)
1: 1 1 12 1 2 7 2 1 9 2 2 16 3 1 12 3 2 15
19:
Read 18 items
#预设一个3*2 值为NA的矩阵
newmat<-matrix(NA,3,2)
#使用mat中的值作为newmat的下标,再进行赋值
newmat[mat[,1:2]]<-mat[,3]
newmat
a<-matrix(1:9,nrow=3,ncol=3)
b<-matrix(9:1,nrow=3,ncol=3)
c<-matrix(c(1,3,2,3,2,5,4,3,2),nrow=3,ncol=3)
a+b #矩阵加法
a-b #矩阵减法
a*b #矩阵乘法
a/b #矩阵除法
rowSums(a) #行求和
rowMeans(a) #行平均
colMeans(a) #列平均
t(a) #矩阵a转置
det(c) #矩阵c的行列式
a%*%b #数学意义矩阵乘法
crossprod(a,b) #矩阵内积
outer(a,b) #矩阵外积
eigen(a) #矩阵特征值及特征向量
solve(c) #求逆矩阵
solve(c,a) #求cx=a
diag(a) #对角线元素
#5)数组创建array(data数组的元素,dim数组维数,dimnames各维度名称标签列表)
data<-c(1:30)
dim1<-c("n1","n2","n3")
dim2<-c("m1","m2","m3","m4","m5")
dim3<-c("o1","o2")
a<-array(data,dim=c(3,5,2),dimnames=list(dim1,dim2,dim3))
a
#7)数组维度转换 没看懂
d<-array(1:24,dim=c(2,3,4))
d
aperm(d,c(2,3,1))
2.2.4 列表
#1)列表创建
mylist<-list(a1=c(1,3,5),a2=T,a3=c(2i+1,-4i+3),a4=c("a","b"));
mylist
#2)列表索引
mylist[[1]]
mylist[1]
#3)列表编辑
#1)列表合并
mylist2<-c(mylist,list(e=c(T,T,F,F)))
#注意下述两个合并的效果:
x<-list(list(1,2),c(3,4))
x
str(x)
y<-c(list(1,2),c(3,4))
y
str(y)
#2)列表转换为向量
unlist(list(c(1:3),c("one","two")))
2.2.5 数据框
#1)数据框创建
names<-c("a","b","c","d")
score<-c(2,3,2,1)
id<-c(1,2,3,4)
df<-data.frame(name=names,sco=score,id=id)
df
#矩阵转数据框
data.matrix<-matrix(1:12,c(3,4))
data.frame(data.matrix)
#2)查看及修改列名称
#输出列名
names(df)
#找到要修改的列名进行赋值修改
names(df)[2]<-"score"
names(df)
#3)数据框索引
#1)索引列
df$name
df[["name"]]
df[[1]]
df[,1]
df[,1:2] #读取多列数据
#2)索引行
df[1:2,]
#3)索引元素
df$name[1] #选取name列的第一行元素
df[["name"]][1]
df[[2]][1] #选取第二列的第一行元素
df[1,2] ##选取第二列的第一行元素
df[1:2,c(1,3,2)] #选取第一、三、二列的第一、二行数据
#4)筛选数据
subset(df,id>2&id<=4,select=c(name,id))
#4)编辑数据框
#1)数据框合并
df_a<-data.frame(id1=c(2,1,4,3),id2=c(3,7,6,9))
cbind(df,df_a) #横向连接 增加数据框属性
df_b<-data.frame(name=c("e","f"),score=c(4,3),id=c(5,6))
rbind(df,df_b) #纵向连接 增加数据框记录条数
#2)数据框删除
df_a[-1,]
df_b[,-1]
2.2.6 因子
#1)生成因子
colour <- c('G', 'G', 'R', 'Y', 'G', 'Y', 'Y', 'R', 'Y')
col <- factor(colour) #创建因子
col
#将因子水平设置为Green、Red、Yellow
col1 <- factor(colour, levels = c('G', 'R', 'Y'), labels = c('Green', 'Red', 'Yellow'))
col1
#将因子水平设置为1,2,3
col2 <- factor(colour, levels = c('G', 'R', 'Y'), labels = c('1', '2', '3'))
col2
col_vec <- as.vector(col2) #转换成字符向量
col_num <- as.numeric(col2) #转换成数字向量
col_vec
col_num
#因子水平为Y的没有设置水平,默认转化为NA
col3 <- factor(colour, levels = c('G', 'R'))
col3
#2)有序和无序因子
factor(c(1,2,3,4))
a<-factor(c(1,2,3,4),levels=c(3,2,1,4),ordered=TRUE)
a
#3)选择参照因子
str(InsectSprays)
head(InsectSprays)
InsectSprays$spray
relevel(InsectSprays$spray,'C')
#4)重排因子顺序
#因子spray根据count的均值大小排序
reorder(InsectSprays$spray,InsectSprays$count,mean)
#5)查看因子和设置水平
a<-as.factor(c(1,2,3))
a
levels(a)
levels(a)[1]
a
nlevels(a)
# 2.数值型因子计算
fert<-c(10,20,20,50,10,20,10,50,20)
fert<-factor(fert,levels=c(10,20,50),ordered=TRUE)
mean(as.numeric(levels(fert)[fert])) #1
mean(as.numeric(as.character(fert))) #2
#3.因子操作
#1)取因子子集
ltes<-sample(letters,size=100,replace=TRUE)
ltes<-factor(ltes)
ltes[1:5,drop=TRUE]
table(ltes[1:5,drop=TRUE])
#2)两因子合并
fact1<-factor(sample(letters,size=10,replace=TRUE))
fact2<-factor(sample(letters,size=10,replace=TRUE))
fact12<-factor(c(levels(fact1)[fact1],levels(fact2)[fact2]))
fact12
#3)多个因子交互成组合因子
data(CO2)
str(CO2)
#各因子交互水平组合:
newfact<-interaction(CO2$Plant,CO2$Type)
#各因子交互水平组合,去除那些在原始数据中没有数值的因子组合
newfact<-interaction(CO2$Plant,CO2$Type,drop=TRUE)
#4.连续型变量创建因子
#1)连续型变量离散化
#breaks为单个整数值:
x<-rep(0:8,c(9,4,6,5,3,10,5,3,5))
#breaks为向量
cut(x, breaks = 2:3, labels = FALSE)
#labels为TRUE时因子就表示为区间,即标签
cut(x, breaks = 2:3)
cut(x, breaks = 3*(-2:5), right = FALSE) #左闭右开
cut(x, breaks = 2*(0:4), right = FALSE)
table( cut(x, b = 8))
y <- c(1,2,3,4,5,2,3,4,5,6,7)
#生成因子有顺序,dig.lab表示区间分割值为4位小数
cut(y, 3, dig.lab = 4, ordered = TRUE)
#2)日期和时间的因子
#生成时间序列
everyday<-seq(from=as.Date('2005-01-01'),to=as.Date('2005-12-31')
,by='day')
#设置日期格式
cmonth<-format(everyday,'%b')
#创建时间因子
months<-factor(cmonth,levels=unique(cmonth),ordered=TRUE)
#按每周分割
wks<-cut(everyday,breaks='week')
#5.因子存储方式
chavec<-c("a","b","c","d")
class(chavec)
chavec_fac<-factor(chavec,ordered=TRUE)
class(chavec_fac)
storage.mode(chavec_fac) #参看存储格式
as.numeric(chavec_fac)
levels(chavec_fac)
2.2.7 数据类型的辨别和转换
is.numeric():辨别是否为数值型;as.numeric:转换为数值型
is.character():辨别是否为字符型;as.numeric:转换为字符型
is.vecter():辨别是否为向量;as.vecter:转换为向量
is.matrix():辨别是否为矩阵;as.matrix:转换为矩阵
is.data.frame():辨别是否为数据框;as.data.frame:转换为数据框
is.factor():辨别是否为因子;as.factor:转换为因子
is.logical():辨别是否为逻辑值;as.logical:转换为逻辑值
2.3 工作空间和查看对象
#2.3.1 工作空间和工作目录
getwd()
setwd("d:\\Users\\rjluo\\Desktop\\R语言工作空间")
#查看对象
ls()
gc()
rm(drv)
help(lm)
options(digits=2)
history()
savehistory("test")
savehistory("myhistory")
loadhistory("myhistory")
save(age_gen,file="myobject")
save.image("myworkspace")
load("myworkspace")
q()
#2.3.2 遍历、创建、删除文件夹
#遍历当前工作目录下的所有文件
list.files(getwd())
#遍历当前工作目录下所有R脚本
list.files(getwd(),pattern = '*.[R|r]$')
#创建文件夹
dir.create("tmp")
#删除文件夹
unlink("tmp")
#如果tmp为空则删除文件夹
unlink("tmp",recursive=F)
#删除文件夹tmp内的所有内容
unlink("tmp",recursive=TRUE)
#2.3.3 查看对象方法
df<-data.frame(id=c(1,2,3,4),score=c(22,12,32,55))
class(df)
length(df)
#查看对象
ls()
#删除对象mat
rm(mat)
summary(df)
str(df)
names(df)
dim(df)
2.4 数据导入和导出
2.4.1 数据导入
着重MySQL 与R的链接
#1)txt文件
#设定路径
setwd("D:\\创作文档\\审查稿件\\2 第二章 R语言") #放文件夹的地方
#读取数据
readtxt<-read.table("readme.txt",header=TRUE,as.is=FALSE)
a
#2) csv文件
setwd("D:\\创作文档\\审查稿件\\2 第二章 R语言")
readcsv<-read.csv("readme.csv",header=TRUE)
#sep允许导入那些使用逗号以外的符号来分隔行内数据,sep=“\t”读取以制表符分隔的文件,默认为sep="",分隔符可以是一个或多个空格、制表符、换行符或回车符
#3) Excel文件
library(xlsx)
#读取testexcel中的第一个sheet
readxlsx<-read.xlsx("readme.xlsx",1)
#还有readxl函数包也可以加载Excel文件
#as.data.frame 是否保存为dataframe
#loadWorkbook():将XLSX文件载入R中作为对象
#getSheets():将R中XLSX对象的表读出并作为对象
#removeRow():可删除某XLSX表对象中的行
#addDataFrame():可向某XLSX表对象中添加数据框
#saveWorkbook():可保存修改过的XLSX对象为XLSX文件
#4) 复制剪贴板数据
read.delim(file,header=TRUE,sep="\t",quote="\",dec=".",fill=TRUE,comment.char="")
read.table("clipboard",header=TRUE)
#5)从其他软件的数据文件中读入
read.spss(file,to.data.frame=TRUE) #从SPSS中读入数据
6)数据库连接及操作
配置好环境后,还需要加载RODBC程序包
常用函数
odbcConnect(dsn,uid=“”,pwd=“”) : 建立并打开连接
sqlTables(channel) :查看数据库表结构
sqlColumns(channel,sqltable) :查看某一张表的表结构
sqlSave(channel,dfname,tablename=sqtable,append=TRUE) :把R中的对象存入SQL server中
sqlFetch(channel,sqtable) :从数据库中读表
sqlQuery(channel,query) :在数据库中查询数据
sqlDrop(channel,sqtable) :删除表
close(channel) :关闭连接
#加载包
library(RODBC)
conn<-odbcConnect("olap",uid="myname",pwd="pwd") #建立连接
sqlTables(conn) #查看数据库中的表信息
sqlColumns(conn,"olapmbuipcategorySDK") #查看数据库中表结构
sqlSave(conn,mtcars,rownames='state',append=TRUE) #保存R对象到数据库中
sqlFetch(conn,"mtcars",rownames="state") #获取表的所有内容
sqlQuery(conn,"select cyl from mtcars where gear=4") #查询数据
sqlDrop(conn,"mtcars") #删除表
close(conn) #关闭连接
2.4.2 数据导出
write(x,file,append=FALSE)
x:数据源
file:输出文件
append:是否清空原有数据,默认FALSE,若为TRUE,则在文件原有内容的基础上追加写入
write.table()
x:要输出的对象
file:要输出到的文件名和路径
append:逻辑值,表示x是否追加到已有的excel中
quote:TRUE时,所有字符型和因子输出时带双引号,若是数字向量,则其元素被作为列索引引用。
sep:每行中数值的分隔符
na:用于数据中缺失值的填充
dec:小数点的字符
row.names、col.names:逻辑值,行名标签是否输出
#将对象mtcars输出到mtcars的txt文件中
write.table(mtcars,file='mtcars.txt',sep=",")
#将对象mtcars输出到test的xlsx文件中,sheet名称设为test
write.xlsx(mtcars,"test.xlsx",sheetName="test")
#将mtcars输出到mtcars的csv文件中
write.csv(mtcars,file="mtcars.csv")
2.5.1 操作符和函数
一些运算符
!= :不等于
!x:非x
x|y :x或y
xor(x,y) :x和y的值不同,返回TRUE,反之返回FALSE
x%in%y: x中的元素是否在y中
identical(x,y):x和y是否相同,且位置是否相同
all.equal(x,y):x和y是否近似相等
is.element(x,y):x中的元素是否在y中
is.na:识别有无缺失值
complete.cases:识别矩阵或数据框中没有缺失值的记录
#---&和&&的区别
c(TRUE, FALSE) & c(TRUE, TRUE)
c(TRUE, FALSE) && c(TRUE, TRUE)
##当左边是FALSE时不管右边是什么结果都是FALSE
FALSE&&A
##这个会报错因为:当左边是TRUE时候需要判断右边
TRUE&&A
#&不管左边是什么都需要判断右边的对象
TRUE&A
FALSE&A
#--all.equal和identical区别
all.equal(1.1,1.4-0.3)
identical(1.1,1.4-0.3)
#3)赋值函数
X <- 0
Fun <- function() { X<<-5 }
Fun()
x
#assign和get 赋值和获取值
#下述两个赋值等价
x<-c(1,2,3,4)
assign("x",c(1,2,3,4))
x
assign("xxx[1]",1)
xxx
xxx[1]
##若赋值对象是文本,那么只能赋值,而只有get函数能查看
get("xxx[1]")
x
get("x[1]")
a<-x[1]
a
get("a")
#----概率函数
normdt<-rnorm(20) #生随机数(随机偏差)
normdt
dnorm(normdt) #密度函数
pnorm(normdt) #分布函数
qnorm(0.9,mean=0,sd=1) #分位数函数
#----字符串函数
x<-c("ab","cde")
length(x)
nchar(x) #x中的字符数量
x<-"abcdef"
substr(x,2,4) #替换的字符串个数大于要替换的字符串个数,多余部分不变
substr(x,2,4)<-"2"
x
substr(x,2,4)<-"222"
x
grep("A",c("b","A","c"))
sub("abc","a","abdscabcac")
strsplit("abc","")
x<-"aBCDabE"
tolower(x) #大写转换
toupper(x) #小写转换
#----输出函数
for(i in 1:3) print(1:i)
name<-"peter"
cat("name:",name)
2.6 数据集操作
2.6.1 变量操作
#1) 创建新变量
#将系统自带的mtcars中的两列选出来
mydata<-mtcars[,c("gear","carb")]
#增加两列数据:sumx是gear和carb的总和;meanx是gear和carb的均值
mydata<-transform(mydata,sumx=gear+carb,meanx=(gear+carb)/2)
head(mydata)
#生成一个序列
id<-rep(1,nrow(mydata))
#直接新增一个列并赋值
mydata$id<-id
#选取前n条数据
head(mydata)
#2) 删除列变量
#删除最后一列
mydata[,-1]
#批量删除列名
myvars<-names(mydata)%in%c("id","meanx")
newdata<-mydata[!myvars]
head(newdata)
#3)对变量重新编码
mydata<-mtcars
mydata$dd<-mydata$wt
attach(mydata)
mydata[which(wt <= 2), ]$ dd<-"第一组"
mydata[which(wt > 2 & wt<= 4), ]$dd <-"第二组"
mydata[which(wt > 4), ]$dd<- "第三组"
detach(mydata)
head(mydata)
#4)变量重命名
names(mydata)
names(mydata)[2]<-"newcyl"
names(mydata)
#5) 变量排序
sort(mtcars$mpg) # 用sort函数对向量进行排序,返回排完序后的向量
sort(mtcars$mpg,decreasing=TRUE) # 倒序排列
#用rank函数对向量排序,返回相应的秩
x<-c(2,3,1,4,3,4,7,5,4)
x
rank(x)
rank(x,ties.method="first")
rank(x,ties.method="random")
rank(x,ties.method="max")
mtcars[order(mtcars$mpg,-mtcars$cyl),] #对数据框中mpg正序、cyl倒序排列
2.6.2 数据集操作
#1)大致了解数据集情况
head(mtcars) #默认查看前6条记录
head(mtcars,10) #查看前10条记录
tail(mtcars) #查看默认后6条记录
tail(mtcars,10) #查看默认后10条记录
#2)查看表结构
str(mtcars)
#3)查看列名
names(mtcars)
#----2数据集修改
#添加列
df_a<-data.frame(id=c(1,2,3),score=c(11,22,33))
df_b<-data.frame(phone=c(123,234,345),add=c('a','b','c'))
df_a;df_b
cbind(df_a,df_b) #直接合并两个数据集
df_c<-data.frame(id=c(1,3,4),add=c('a','b','c'))
merge(df_a,df_c) #按公共变量连接,只连接有的公共元素
df_d<-data.frame(id=c(5,6),score=c(44,55))
rbind(df_a,df_d) #添加行
#-------3 数据集选取
head(mtcars[,c(1,2)])
head(mtcars[,c("mpg","disp")])
myvars<-c("mpg","disp")
head(mtcars[myvars])
#2)剔除变量
head(subset(mtcars,select=c(-mpg,-cyl)))
myvars<-names(mtcars)%in%c('disp',"hp")
head(mtcars[!myvars])
#3)选入观测
subset(mtcars,disp>=150 & hp<110,select=c("mpg","cyl","hp"))
#4)选取某列不重复的数值
unique(mtcars$cyl)
#5)挑选重复值记录
x<-c(9:20,1:5,3:7,0:8)
x[duplicated(x)] #取出重复值
x[!duplicated(x)] #取出没有重复的指
duplicated(x,fromLast=TRUE) #从后往前判断重复
#6)随机抽取n条记录
#随机数范围:行数不能超过数据集的行数
x<-c(1:nrow(mtcars))
#sample生成随机数
sample(x,size=5,replace=FALSE)
samp<-sample(x,size=5,replace=FALSE)
samp
mtcars[samp,]
2.6.3 数据集连接
base包中的merge函数,dplyr包中可以使用intersect函数取两个数据集的交集,用union函数取两个数据集的并集,用setdiff函数取两个数据集的差集等。
x<-data.frame(a=c(1,2,4,5,6),x=c(2,12,14,21,8))
y<-data.frame(a=c(1,3,4,6),y=c(8,14,19,2),x=c(2,3,4,5))
merge(x,y) #根据相同字段内连接,即a和x两个字段全相等才连接
merge(x,y,by=c("a")) #根据字段a内连接
merge(x,y,all=TRUE) #根据相同字段全链接
merge(x,y,all.x=TRUE,by=c("a")) #左连接
merge(x,y,all.y=TRUE,by=c("a")) #右连接
merge(x,y,by=c("a","x")) #根据a和x两个字段连接
merge(x,y,by.x="a",by.y="y") #根据x表中a和y表中y连接
#也可以使用sqldf包的SQL语句选取数据
library(sqldf)
newdf<-sqldf("select * from mtcars where carb=1 order by mpg",row.names=TRUE)
2.6.4 数据汇总
#设置有效位数为3
options(digits=3)
aggdata<-aggregate(mtcars,by=list(mtcars$cyl,mtcars$gear),FUN=mean,na.rm=TRUE)
aggdata ##以cyl和gear为排序条件,计算每个指标的均值
ma <- matrix(c(1:4, 1, 6:8), nrow = 2)
apply(ma,1,sum)
apply(ma,2,sum)
year<-c(2007,2007,2007,2007,2008,2008,2008,2009,2009,2009)
province<-c("A","B","C","D","A","C","D","B","C","D")
sale<-c(1,2,3,4,5,6,7,8,9,10)
da<-data.frame(year,province,sale)
tapply(da$sale,list(year,province),mean)
x <- list(a = 1:10, beta = exp(-3:3),logic=c(TRUE,FALSE,FALSE,TRUE))
x
lapply(x,quantile) ##对x每个元素应用函数,生成一个与元素个数相同的值列表
sapply(x,quantile) ##对x每个元素应用函数,生成一个与元素个数相同的值列表或矩阵
#重复生成1:4,每个元素分别重复1次、2次、3次和4次
mapply(rep,times=1:4,1:4)
#重复生成列表
#先是1两次,再是2两次,然后1再两次,最后2两次
mapply(rep,times=c(2,2),MoreArgs=list(x=1:2))
2.7 控制流
#for 循环
for (i in 1:5) print("hello")
#生成Fibonacci数列
x <- c(1,1)
for (i in c(3:30)) {
x[i]<- x[i-1]+x[i-2]
}
x
#while 结构
x <- c(1,1)
i <- 3
while (i <= 30) {
x[i] <- x[i-1]+x[i-2]
i <- i +1
}
#repeat-break 循环 ##repeat是无限循环,加上break后,在达到条件后跳出循环
pv<-c(1,2,3,2,1,2,15,7,21)
i<-1
result<-""
repeat{
if(i>length(pv)){
break
}
if(pv[i]<=5){
result[i]<-"初级用户"
} else if(pv[i]<=15){
result[i]<-"中级用户"
} else{
result[i]<-"高级用户"
}
i<-i+1
}
result
2.7.2 条件执行
1.if-else结构,else语句不能单独占一行,除非在大括号内
a<-2
{
if(a==1) {
case<-1
case1<-case+1
}
else if(a==2) {
case<-2
case1<-case+2
}
else {
case<-3
case1<-case+3
}
}
case1
#2) ifelse结构
a
ifelse(a>1,b<-1,b<-2)
#--switch结构
i<-"happy"
switch(i,
happy="a",
afraid="b",
sad="c",
angry="d"
)
#输出第二个向量
switch(2,mean(1:10),1:5,1:10)
2.8 自定义函数
myfun<-function(a,b){
x<-a+b
return(x)
}
myfun(1,2)
x<-2
myfun<-function(a,b){
x<-a+b
return(x)
}
myfun(1,2)
x<-2
myfun<-function(a,b){
x<<-a+b
return(x)
}
myfun(1,2)
x
“<-”赋值符号在函数体内可以赋值,但是无法在工作空间中赋值,“<<-”既可以在函数体内赋值,也可以在工作空间中赋值