赞
踩
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")
2.5.2 函数
1.数学函数
2.统计函数
#----概率函数 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
“<-”赋值符号在函数体内可以赋值,但是无法在工作空间中赋值,“<<-”既可以在函数体内赋值,也可以在工作空间中赋值
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。