R语言实战(第2版) 学习笔记
1. R语言介绍
1.1 为什么用R语言
bla
1.2 基本操作
图表演示命令 demo()
1.2.1 输入
source("filename")
# run script
1.2.2 输出
最后要 dev.off
完成输出
文本文件
sink("filename", append = TRUE, split = TRUE)
append
接在已有文件后面,而不是覆盖;
split
控制台、文件均有输出
图形文件
jpeg("filename.jpeg")
png,bmp,pdf等
2. 数据集
2.1 数据结构
2.1.1 向量 Vector
例: a <- c(1, 2, 5, 7, -2, -20)
标量 指只有一个元素的向量,如
f <- 3
,通常用于保存常量。 在R里就是单元向量
取值方法: a[3], a[c(1,2,5)], a[2:5]
2.1.1 矩阵 Matrix
构建函数接口:
myMatrix <- matrix(<vector>, nrow=<number of rows>, ncol=<number of columns>, byrow=<TRUE or FALSE>, dimnames=list(<vector of rownames>,<vector of colnames>))
个别参数说明: byrow
指定按行或列填充,默认FALSE,即按列填充; dimnames
指定行列的名字。
测试代码:
cells <- 1:6
rnames <- c("R1", "R2")
cnames <- c("C1", "C2", "C3")
myMatrix <- matrix(cells,nrow = 2, ncol = 3, byrow = TRUE, dimnames = list(rnames, cnames))
myMatrix
myMatrix <- matrix(cells,nrow = 2, ncol = 3, byrow = FALSE, dimnames = list(rnames, cnames))
myMatrix
dimnames(myMatrix)
dimnames(myMatrix)[[1]][2] <- "R2name"
myMatrix
myMatrix[1, 2]
myMatrix[1, c(1, 3)]
2.1.3 数组 Array
维度大于2的矩阵
d3names <- c("3rd1", "3rd2")
myArray <- array(1:12, c(2, 3, 2), dimnames = list(rnames, cnames, d3names))
myArray
2.1.4 数据框 Dataframe
包含不同类型的Vector
pid <- 1:4
diabetes <- c("type1","type2","type1","type1")
status <- c("poor","improved","excellent","poor")
patientdata <- data.frame(pid, diabetes, status)
table(patientdata$diabetes, patientdata$status)
with(patientdata,{
table(diabetes, status)
mark1 <- 1:4
mark2 <<- 1
})
mark1
patientdata$mark1
mark2
patientdata$mark2
实例标识符?? 这是什么??
2.1.5 因子 factor
status <- factor(status, order = TRUE, levels = c("poor", "improved", "excellent"))
stauts
status <- factor(status, order = TRUE, levels = 1:3, labels = c("poor", "improved", "excellent"))
stauts
# in default, factors are labeled by alphabet order
diabetes <- factor(diabetes)
patientdata <- data.frame(pid, diabets, status)
# show structure
str(patientdata)
summary(patientdata)
2.1.6 列表 list
包含不同类型对象,对象可以是vector, matrix, dataframe等等
patientlist <- list(patient = patientdata, ages = 20:23, 1:10)
patientlist
patientlist$patientdata
patientlist$ages
patientlist[[2]]
patientlist[["ages"]]
数据输入
2.2.1 键盘输入
mydata <- data.frame(age=numeric(0), gender = character(0))
mydata <- edit(mydata) # equals to fix(mydata)
2.2.2 从csv读取 read from csv
推荐stringAsFactors = FALSE
节省读取时间
2.2.3 从数据库读取 read from db
library(RODBC)
myconn <- odbcConnect("localhost:8080/test", uid="root", pwd="1234")
test.table.data <- sqlQuery(myconn, "select * from T_Test")
close(myconn)
常用函数
2. 图形初阶
2.1 图形参数
2.1.1 符号和线条
dose <- c(20, 30, 40, 45, 60)
drugA <- c(16, 20, 27, 40, 60)
drugB <- c(15, 18, 25, 31, 40)
plot(dose, drugA, type = "b")
# 修改图形元素
opar <- par(no.readonly = TRUE)
par(lty=2, pch=17)
plot(dose, drugA, type = "b")
par(opar)
# 更推荐直接在调用时候设置参数
plot(dose, drugA, type = "b", lty = 2, pch = 17)
plot(dose, drugA, type = "b", lty = 3, lwd = 3, pch = 15, cex = 2)
picture here
2.1.2 颜色
2.1.3 文本属性
2.1.4 图形大小
更多可以参阅 help(par)
2.2 添加文本、自定义坐标轴和图例
# xlim是x坐标轴范围,ylim类似
plot(dose, drugA, type = "b",
col = "red", lty = 2, pch = 2, lwd = 2,
main = "Main Title", sub = "Subtitle",
xlab = "xlab name", ylab = "ylab name",
xlim = c(0, 60), ylim = c(0, 70))
2.2.1 标题
title(main = "Main Title", col.main = "red",
sub = "Subtitle", col.sub = "green",
xlab = "xlab name", ylab = "ylab name",
col.lab = "blue", cex.lab = 0.75)
2.2.2 坐标轴
略
2.2.3 参考线
abline(h = <yvalues>, v = <xvalues>)
也可以添加 lty
,col
等参数
2.2.4 图例
picture here
2.2.5 标注
2.3 图形的组合
par(mfrow = c(nrows, ncols))
layout(matrix(c(1,1,2,3), 2, 2, byrow = TRUE))
layout(matrix(c(1,1,2,3), 2, 2, byrow = TRUE, widths = c(3,1), heights = c(1, 2)))
3. 基本数据管理
3.1 创建新变量
mydata <- data.frame(x1 = c(2, 2, 6, 4),
x2 = c(3, 4, 2, 8))
mydata$sumx <- mydata$x1 + mydata$x2
mydata$meanx <- (mydata$x1 + mydata$x2) / 2
mydata <- transform(mydata,
sumx = x1 +x2,
meanx = (x1 +x2) / 2)
3.2 重命名
fix(mydata)
or names(mydata) <- c("y1", "y2", "sumy", "meany")
3.3 缺失值
数值函数中的参数na.rm = TRUE
比如sum(x, na.rm = TRUE)
函数na.omit(mydata)
可以删除mydata
中含有na的行
3.4 日期
3.4.1 格式化输入
从字符串转化用as.Date(x, <"input format">)
picture here
默认格式为"yyyy-mm-dd"
strDates <- c("01/05/1965","08/16/1875")
date <- as.Date(strDates, "%m/%d/%Y")
3.4.2 格式化输出
today <- Sys.Date()
format(today, format = "%B,%d,%Y")
3.4.3 计算
difftime(<end>, <start>, units = "weeks")
可以按星期、天、时、分、秒来表示
3.4.4 转化为字符串
strDates <- as.character(dates)
3.5 类型转换
is.datatype()
用于判断,as.datatype()
用于转换
上面的"datatype"可以是numeric character vector matrix data.frame factor logical
3.6 排序
newdata <- mydata[order(x1, -x2),]
3.7 合并
内联
total <- merge(dataframeA, dataframeB, by = "ID")
cbind()
or rbind()
3.8 子集
newdata <- subset(mydata, x1 > 1 & x1 <6, select = c(x1:x2))
3.9 抽样
mysample <- mydata[sample(1:nrow(mydata), 3, replace = FALSE), ]
从1:nrow()
行抽3
个样本,不进行放回操作
更多抽样功能参照sampling包
3.10 SQL查询
sqldf包 推荐!!
注意: R 语言函数不对 对象 本身进行操作,而是操作其复制体,所以记得赋值
nndata <- sqldf(c("delete from nndata where target = 'target'","select * from nndata"))
4. 数据管理
4.1 数值处理
常用函数:
abs(x), sqrt(x)
ceiling(x), floor(x) # 向上 向下取整
trunc(x) # 取整数部分
round(x, digits = n) # 四舍五入,保留n位小数
mean(x) # z <- mean(x, trim = 0.05, na.rm = TRUE) 去掉最大最小的5%
sum(x) # 求和
median(x) # 中位数
sd(x) # 标准差
var(x) # 方差
mad(x) # 绝对中位差
quantile(x, c(.75, .5, .25)) # 输出x中75%、50%、25%位的数值
diff(x, lag = n) # 之后差分
scale(x, center = TRUE, scale = TRUE) # 进行均值为0,标准差为1的标准化
4.2 概率函数
数学太差看不懂(:з」∠)
4.3 字符串处理
nchar(x) # 长度
substr(x, start, stop) # 子串
# 在x中搜索pattern, `fixed = TRUE`时 pattern为正则表达式, 否则为字符串
grep(pattern, x, ignore.case = FALSE, fixed = FALSE)
sub(pattern, replace, x, ignore.case = FALSE, fixed = FALSE) # 在x中搜索pattern替换为replace
strsplit(x, split, fixed = FALSE) # 在x中的split处拆分字符串
paste(c("a","b"), 1:2, sep = "M") # 拼接字符串
toupper(x) # 转化为大写
tolower(x) # 转化为小写
4.4 其他常用函数
length(x)
seq(from, to, by) # seq(1, 5, 2)生成c(1, 3, 5)
rep(x, n) #将x重复n次
pretyy(x, n) # 将连续的x划分为n个区间,画图常用
cat(..., file = "myfile", append = FALSE) # 拼接...中的对象,输出到myfile中
apply(x, margin, fun, ..) # 将fun函数应用到x的第margin维度
4.5 整合与重构
4.5.1 转置
t(matrix)
4.5.2 整合数据
reshape2包 功能强大,用到再说吧