@Macux
        
        2015-12-01T06:44:40.000000Z
        字数 6347
        阅读 1496
    R语言_学习笔记
1、在ubuntu下安装R
sudo apt-get install r-base#可能需要取得现取得ROOT权限:su→"input your password"→ok;
2、在ubuntu下安装RStudio: 
参看帖子
3、安装R包
>install.packages("包名") #引号不可省略
4、加载R包
>library(包名) #此处无引号
1、向量。(R中处理数据的最基本的单位)
> x <- c(1,2,3,4)[1] 1 2 3 4> y <-append(x,99,after=2)# after=2表示在向量x的第三个元素位置插入99。[1] 1 2 99 3 4
> x <- c(1,2,4,5,6)> x[c(1,3)] #extract elements 1 and 3 of x> x[1:3] #extract elements 1 throuth 3 of x> x[-2] #exclude element 2
> seq(from=12,to=30,by=3) #生成首项为12,末项为30,等差为3的等差数列。> seq(from=12,to=30,length.out=100)#生成首项为12,末项为30,个数为100个的等差数列。> rep(c(1,4,1,5),5)#将向量(1,4,1,5)重复5次> 3:15#生成3到15之间的整数
> x <- c(1:10)> any(x>5)[1] TRUE> all(x>5)[1] FALSE
(1)、subset()输出的符合筛选条件的元素值;
> x <- c(1,2,3,4,6)> subset(x,x>4)[1] 6
(2)、which()输出的符合筛选条件的位置;
> x <- c(1,2,3,4,6)> which(x>4)[1] 5
两者都是用于筛选,更为常用的是subset()
(3)、ifelse()类似于常见的if-then-else结构;
> x <- c(1,2,3,5,6)> ifelse(x>5,2*x,10*x) #x>5是一个布尔值向量,该函数返回的是向量。[1] 10 20 30 50 12
2、矩阵。
>ko <- matrix(c(1,2,4,5,7,9),2,3)#第一个“2”表示行数,第二个“3”表示列数。矩阵默认是按列存储。
>ko <- matrix(c(1,2,4,5),2,2)>t(ko) #转置矩阵ko>solve(ko) #对矩阵ko求逆>po <- matrix(c(3,1,1,1),2,2)>po %*% ko #矩阵po与矩阵ko相乘>diag(n) #生成一个n阶的单位矩阵
3、列表
#最简单创建列表的方法> list(1,2,3)[[1]][1] 1[[2]][1] 2[[3]][1] 3#也可以对列表的各组件设置标签,例如:> list(ke=1,ko=2,lo=3)$ke[1] 1$ko[1] 2$lo[1] 3
> k <- list(a=1,b=2)> k$a[1] 1$b[1] 2> k$c <- 4 #为列表k添加一个新的组件> k$a[1] 1$b[1] 2$c[1] 4> k$b <- NULL #删除列表k中的某一组件> k$a[1] 1$c[1] 4
> unlist(k)a c1 4
> k1 <- list(a=c(1:9),b=c(2:10),c=c(7:13))> k1$a[1] 1 2 3 4 5 6 7 8 9$b[1] 2 3 4 5 6 7 8 9 10$c[1] 7 8 9 10 11 12 13> lapply(k1,mean)$a[1] 5$b[1] 6$c[1] 10
当lapply()返回的列表可以转化为矩阵或向量时,就可以使用sapply()。例如:
> lapply(k1,mean)$a[1] 5$b[1] 6$c[1] 10> sapply(k1,mean)a b c5 6 10#想要更简单,可以用unname()把元素名也去掉。> op <- sapply(k1,mean)> unname(op)[1] 5 6 10
4、数据框 
用R做数据分析时,数据存储的类型都是数据框。
数据框与列表的区别
数据框的本质在于“列”,每一列可视为一个独立的Vector,每一列都有一个name,即数据的属性标示符,标示符有两种用法:
同属性下的互相比较。例如每一列都表示工资水平,但它们来自不同的员工。
所有属性用于表征一个个体。花的属性有颜色,大小等,但每一列的数据又都受到另一个因子的影响,例如地方。
数据框与矩阵的区别
# 注意输出的形式> dr <- data.frame(kids,ages)> drkids ages1 jack 122 jim 13> ko1 <- as.matrix(dr)> ko1kids ages[1,] "jack" "12"[2,] "jim" "13"
> dfrmo <- data.frame(C1=v1,C2=v2,C3=v3,C4=f1,C5=f2)#v1,v2,v3为向量,f1和f2为因子。#C1~C5是数据框每一列的列名。#有一种很重要的参数:stringAsFactor,默认是TRUE,即当用字符向量创建数据框时,R会讲向量转换为“因子(factor)”
根据位置选择数据框的列
更高端地选择数据框的列
> subset(dfrmo,select=c(col1,...,colk),subset=(kobe>81))#subset=(kobe>81)表示逻辑表达式。#select=c(col1,...,colk)表示要返回的是哪些列。
PS:筛选数据库的子集时,还可以参考更高大上的ddply()函数。(来自plyr包,详见《ggplot2》P165)
> attach(dfrmo) #将数据框dfrmo添加到R的搜索路径#假设数据框dfrmo中有一列是Geo <- c(1,2,3,4,5),现在想把它拿出来,只需要:> ki <- Geo #此处已不需要dfrmo$Geo
> dfrmo <- as.data.frame(mat)#mat可以是一个矩阵或是列表,现将其转换成数据框,并赋给变量dfrmo> colnames(dfrmo) <- c("lakers","spurs","clippers")#修改数据框dfrmo的列名
更高大上的修改列名(变量名)的方法
使用reshape包中的rename()函数> library(reshape)> states <- rename(states,c(Income = "Salary" )) #将数据框states中变量Income的名称改为Salary。
> temp <- edit(dfrmo)# 此时会弹出编辑器窗口。待修改完成后,edit函数会把更新后的数据框赋给temp,但原数据框dfrmo未被修改。> dfrmo <- temp# Overwrite only if you're happy with the changes!
更为简单的修改数据框的方法:> fix(dfrmo)# 调用fix()函数启动修改器,它会自动保存修改结果并覆盖原数据框。但是一旦修改,就没有办法撤销。
> clean <- na.omit(dfrmo)#把数据框dfrmo中含有NA值的那一行移除,并将新的数据框赋给clean.
> bryant <- subset(dfrmo,select = -james)# All colums except james
> kobebryant <- cbind(kobe,bryant)#按列合并。当两个数据框行数一样时,选择cbind> kobebryant <- rbind(kobe,bryant)#按行合并。当两个数据框的列数一样,且每一列分别对应同一属性,例如age,gender等时,选择rbind.
(1)、split()
# 对数据框中的某一列进行分类。方法是利用因子来对向量进行分类,因子多为同一数据框的另一列。#该函数返回的是一个向量列表,列表的tag是因子名称。> group <- split(Cars$city,Cars$Origin) #Cars$Origin是因子
(2)、apply()
#将函数应用于每行> apply(mat/dfrm,1,fun)#将函数应用于每列> apply(mat/dfrm,2,fun)#这里所调用的函数fun,都是以Vector作为参数的.
(3)、tapply()
#将某一数据框中的某一列数据(连续型变量),按照另一列分组因子(名义型变量)进行分组,并传递给函数fun.> tapply(x,f,fun)#x为向量,f为分组因子,fun是以Vector为参数的函数
(4)、by()
#它与tapply()最大的不同在于,它可以接收数据框或列表对象。> by(dfrm,fact,fun) #一般来说,因子也是源于原数据框dfrm.
> m <- merge(df1,df2,by="name")#name是数据框df1和df2共有列的列名。
5、因子
变量可归结为名义型、有序型、连续性三种类型的变量。
名义型变量,既不能比较大小,也没有顺序,只起到区别的作用。例如糖尿病类型Diabetes(Type1,Type2)就是名义型变量,在数据中Type1编码为1,Type2编码为2,这里的“1”和“2”只是为了区分不同的糖尿病类型。
有序型变量表示一种顺序关系,它只起到比较的作用,不能运算。例如病情Status(poor,improved,excellent)就是顺序型变量,病情为poor的病人的状态就不如病情为improved的病人。但由于Status只是有序型变量,不能进行运算,所以不知道这两个病人之间的病情到底相差多少。
在R中,名义型变量(类别变量)和有序型变量被称为因子(factor)。
> Diabetes <- c("Type1","Type2","Type1","Type1")> Diabetes <- factor(Diabetes)#该语句将向量存储为(1,2,1,1),并在内部将其关联为1=Type1,2=Type2。> status <- c("Poor","Improved","Excellent","Poor")> status <- factor(status,ordered=TRUE)#该语句将向量存储为(3,2,1,3),并在内部将这些值关联为1=Excellent、2=Improved、3=Poor
对于因子概念的理解: 
R在处理数据时,实质还是要回归原始,处理“0”和“1”这种二进制的数值型数据。引入“因子”,是为了说明在某些时候,数字并不是一般意义上的数字,例如名义型的数据,它们仅表示不同的类,故又称之为分类变量(categorical variable)
(1)、将一个字符串向量或数值向量,转换为因子。
> lakers <-factor(c("kobe","fisher","kobe","paul"))> lakers[1] kobe fisher kobe paulLevels: kobe fisher paul
(2)、有几组数据,每组包含一个向量。先对这些向量合并成一个长向量并且同时创建一个平行向量来识别每个值的原始组。
> comb <-stack(list(fresh=freshmen,soph=sophomores,jrs=juniors)) #stack()函数将列表合并为一个两列的数据框,两个列分别为values和ind。第一列包含数据,第二列包含它的平行因子。> print(comb)values ind1 0.60 fresh2 0.35 fresh3 0.71 soph4 0.38 soph5 0.19 jrs6 0.58 jrs
(3)、一个很有用的函数table()
> table(Type)TypeCompact Large Midsize Small Sporty Van16 11 22 21 14 9
向量Type是一个因子,table()函数可以统计不同因子的频数。这在描述性统计和绘制拼图、条形图时,相当好用!! 
6、不同结构化数据类型间的转换
#向量篇h <- as.list(vec) #建立列表h <- matrix(vec,n,m) #建立n x m矩阵h <- as.data.frame(vec) #建立一列数据框h <- as.data.frame(rbind(vec)) #建立一行数据框#矩阵篇j <- as.vector(mat)j <- as.list(mat)j <- as.data.frame(mat)#列表篇k <- unlist(lst) #列表向向量k <- matraix(lst,n,m) #建立n x m矩阵k <- as.data.frame(lst) #将列表元素作为数据框列#数据框篇l <- as.vector(as.matrix(dfrm))#抽取数据框dfrm的所有元素,并使其成为一个长向量。l <- as.list(dfrm)l <- as.matrix(dfrm)
> dfrm <- read.table("statistic.txt",header=TRUE)#header=TRUE 表示该数据有标题行。#若想防止read.table函数把字符串变量转化为因子,可以设置参数stringAsFactor=FALSE.
> tbl <- read.csv("table-name.csv",header=TRUE)#可以设置参数as.is=TRUE(默认是FALSE),使字符型向量不被R视为Factor。
> tbl <- read.csv("http://www.example.com/download.data.csv")
> library(XML)> url <- 'http://en.wikipedia.org/wiki/World_population'> tbls <- readHTMLTable(url,which=k)
读取Excel格式数据 
将文件另存为CSV格式后,按照CSV格式数据读取方法读取。
其它格式的数据读取方法,可参见《R语言实战》P34~P37