#数据框(data frame)的建立
#一个数据框就是将许多向量组合起来的一个对象,它是二维的,通常其列表示变量, 其行表示观测. 显示数据框时左侧会显示观测值的序号.
read.table()
read.csv()
read.delim()
x <- c(42, 7, 64, 9)
y <- 1:4
z <- data.frame(INDEX=y, VALUE=x)
z
#数据框中向量必须有相同的长度或长度有倍数关系
weight <- c(70.6, 56.4, 80, 59.5)
s <- c("adult", "teen")
dat <- data.frame(weight, age=s)
dat
help(Puromycin)            #显示该数据集的详细信息
head(Puromycin)           #显示该数据集的前几行
summary(Puromycin)    #显示主要的描述性统计量
pairs(Puromycin, panel=panel.smooth)#通过成对数据散点图显示变量之间的关系
xtabs(~state + conc, data=Puromycin)#由交叉分类因子产生一个列联表, 显示交叉变量的频数
#数据框的下标与子集的提取:同矩阵
Puromycin[1, 1]
Puromycin[c(1, 3, 5), c(1, 3)]
Puromycin[c(1, 3, 5), c("conc", "state")]
Puromycin[c(1, 3, 5), ]  # 取出整个行(观测值)
Puromycin$conc           # 取出变量的值
#添加新的变量
Puromycin$iconc <- 1/Puromycin$conc  # 基本方法
Puromycin$iconc <- with(Puromycin, 1/conc)   #使用with函数
head(Puromycin)
Puromycin <- transform(Puromycin, conc2 = conc^2,sqrtconc = sqrt(conc))   #使用transform,且一次性可定义多个变量
head(Puromycin)
#提取满足条件的子集(观测值)
subset(Puromycin, state == "treated" & rate > 160)
subset(Puromycin, conc > mean(conc))
#分组计算
library(doBy)
help(package=“doBy”)      #了解这个包所包含的内容
summaryBy(conc ~ state, data=Puromycin, FUN=c(mean, median, var))
#排序
PuromycinOrder <- orderBy(~conc, data=Puromycin)
PuromycinOrder
cbind(PuromycinOrder, Puromycin)
####列表(list)
#复杂的数据分析时,仅有向量与数据框还不够,有时需要生产包含不同类型的对象
#R的列表(list)就是包含任何类型的对象
#例子:
L1 <- list(x=1:6, y=matrix(1:4, nrow=2))
L1
L1$x
L1$y
#列表子集的提取
#下面三种方式等价:
L1$x
L1[1]
L1[[1]]  
#下面两种方式等价:
L1[[2]][2,1]
L1$y[2,1]
getwd()
#用getwd()获得工作目录的路径
#用setwd(“C:/data”)将当前工作目录改为C:\data, 也可通过“文件”菜单中的“改变工作目录”来完成
#保存数据!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
d <- data.frame(obs=1:3, treat=c("A", "B",  "A"),      
weight = c(2.3, NA, 9))
#将数据框保存为txt文件
write.table(d, file="dat.txt", row.names=F, quote=F) 
#row.names=F表示行名不写入文件, quote=F表示变量名不放在双引号中
#将数据框保存为csv文件
write.csv(d, file="dat.csv", row.names=F, quote=F) 
#将数据框保存为R数据格式(.Rdata)
save(d, file="dat.Rdata")
#保存整个工作空间
save.image()  #也可通过“文件”菜单下的“保存工作 空间”来完成
#读取数据!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
d1 <- read.table(file="dat.txt", header=T)
#若明确数据的第一行作为表头行, 则用header=T
d2 <- read.csv(file="dat.csv", header=T)
#读取Excel数据 ---- 使用RODBC包 
library(RODBC)
help(package="RODBC")
z <- odbcConnectExcel("cha2RODBC.xls")
d3 <- sqlFetch(z, "Sheet1")
close(z)
#加载R数据框
load("dat.Rdata")   
d
*****************************************************
#R的图形功能
#R语言提供了两种作图方法
#使用R的标准作图方法:
#使用plot()建立基本的图形,然后添加线(lines), 点(points)和文本(text)等. 其中plot()函数提供了丰富的作图符号、线型、颜色及标题、坐标等.
#使用“lattice”软件包的trellis作图功能,其主要的作图函数是xyplot(). 它尤其适用于展示两个变量之间的关系如何随第三个变量的变化而变化的。

#高级绘图函数
plot(x, y)    #---- x vs y的二元作图
boxplot(x)  #---- 箱线图
hist(x)   #----  直方图  
qqnorm(x)  #---- 正态分位数图(QQ图)
#例子:
y <- rt(200, df = 5)#随机生成200个自由度为5的t分布的随机数
boxplot(y)
hist(y)
qqnorm(y)
#绘图函数的部分选项
type #--- 指定图形的类型, 如“p”: 点, “l”: 线
xlim=, ylim= #--- 指定轴的上下限
xlab=, ylab= #--- 指定坐标轴的标签, 字符型
main= #--- 主标题,字符型
col#颜色
pch#类型
#低级绘图函数
points()     #---  添加点
lines()   #--- 添加线
#例子: 
plot(rate ~ conc, data=Puromycin, xlim=c(0,1.2),ylim=c(40,210), xlab="Rate", ylab="Concentration", main="Puromycin", col=4, pch=2)
lines(stats::lowess(Puromycin), col=2)
#单一的散点图
#简单的散点图
str(Puromycin) 
PuroA <- subset(Puromycin, state=="treated")
plot(rate~conc, data=PuroA, col=3)
#指明数据集的三种方式
plot() #函数中使用data选项
#with()中使用plot()
with(PuroA, plot(conc, rate))
#使用$直接指向数据与变量
plot(PuroA$conc, PuroA$rate)
#两个图形的叠加
#以 Puromycin为例,将rate与conc之间的关系按state的两个值“treated”和“unreated”分别画散点图和添加局部多项式光滑线
library(locfit)
sym <- c(1, 2)[Puromycin$state]
plot(rate~conc, data=Puromycin, col=sym, pch=sym)
smoothA <- locfit(rate ~ lp(conc, nn=1,deg=1),data=PuroA)
PuroB <- subset(Puromycin, state=="untreated")
smoothB <- locfit(rate ~ lp(conc, nn=1,deg=1),data=PuroB)
lines(smoothA, lty=1)
lines(smoothB, lty=3, col=2)
#并列作图
#使用par(mfrow=c(m,n))可以将当前窗口分割为m * n个窗口作图
par(mfrow=c(1,2))
plot(rate~conc, data=PuroA, main="state=treated")
lines(smoothA, lty=1)
plot(rate~conc, data=PuroB, main="state=untreated")
lines(smoothB, lty=1)
***********************************************************
##R编程基础
#条件语句
#避免除零或负数的对数等数学问题
#形式1
if  (条件)   表达式1     else    表达式2
if  (条件)   命令1        else    命令2
#形式2
ifelse (条件, yes, no)
x <- -4:6
if(x>0) sqrt(x) else NA#用逻辑向量第一个元素判断 然后执行后面的命令
y <- 6:(-4)
if(y >0) sqrt(y)  else NA
ifelse(x>0, sqrt(x), NA) 
ifelse(y>0, sqrt(y) , NA) 
sqrt(ifelse(x>0, x, NA))
#循环语句: for()
#使用场合:知道循环次数
#形式
for (变量 in 向量)   表达式/命令
for (变量 in 向量)  {
  命令组
}
#例:求费氏数列的前12项
Fibonacci <- rep(0, 12)
Fibonacci[1] <- Fibonacci[2] <- 1
for(i in 3:12) Fibonacci[i] <- Fibonacci[i-1] + Fibonacci[i-2]
#循环语句: while()
#使用场合:无法知道运行次数
#形式:
while(条件)  表达式/命令 
while(条件)  {
  命令组 
}
#例子:
Fib1 <- 1; Fib2 <- 1
Fibonacci <- c(Fib1, Fib2)
while(Fib2 < 300) {
  Fib3 <- Fib1 + Fib2
  Fibonacci <- c(Fibonacci, Fib3)
  Fib1 <- Fib2
  Fib2 <- Fib3
}
#循环语句: repeat
#使用场合:重复使用某个/组命令
#形式:
repeat 表达式/命令
repeat {
  命令组
}  
#Break语句:跳出for, while, repeat循环体
#repeat循环体中break命令是必不可少的!  
for(i in 1:5) print(1:i)
i<-1
while(i <= 5) {
  print(1:i)
  i <- i+1
}
i <- 1
repeat{ 
  print(1:i)
  i <- i+1
  if(i > 5) break
}
#函数