r语言数据分析详细代码(R语言数据挖掘实践)
r语言数据分析详细代码(R语言数据挖掘实践)library(plyr)install.packages("plyr")在R中,apply函数族是在对列表或者向量每个元素调用函数的首选方法。虽然R基础库中有这些函数,但它们的使用可能难以掌握。plyr包 是一个对R基础库中诸如split apply combine的泛函的更好用的替代。plyr 给予我们一些函数 (ddply daply dlply adply ldply)按照常见的蓝图:将数据结构分组拆分,对每个组应用一个函数,将结果返回到数据结构中。ddply 拆分一个数据框(data frame)并且返回一个数据框 (所以是 dd)。 daply 拆分一个数据框并且返回一个数组(array) (所以是 da)。
和其他语言相比,R可以更模糊和麻烦。但是,有大量的包可以在R基础库上提供简单和熟悉的界面。
1. sqldfR语言学习曲线中最陡峭的一部分就是语法,听到很多人问如何实现VLOOKUP?!?R 对于一般的数据粗加工任务非常有用,但需要一段时间才能掌握。可以认为sqldf是R语言的”辅助轮子”。sqldf让你在R数据框上执行SQL查询。来自SAS的人会发现它非常熟悉,任何具有基本SQL技能的人都可以轻松的使用它—sqldf使用SQLite语法。
install.packages("sqldf")
library(sqldf)
3. plyr在R中,apply函数族是在对列表或者向量每个元素调用函数的首选方法。虽然R基础库中有这些函数,但它们的使用可能难以掌握。plyr包 是一个对R基础库中诸如split apply combine的泛函的更好用的替代。
plyr 给予我们一些函数 (ddply daply dlply adply ldply)按照常见的蓝图:将数据结构分组拆分,对每个组应用一个函数,将结果返回到数据结构中。
ddply 拆分一个数据框(data frame)并且返回一个数据框 (所以是 dd)。 daply 拆分一个数据框并且返回一个数组(array) (所以是 da)。
install.packages("plyr")
library(plyr)
# 按照 Species 拆分数据库,汇总一下,然后转换结果
# 到数据框
ddply(iris .(Species) summarise
mean_petal_Length=mean(Petal.Length)
)
# Species mean_petal_length
#1 setosa 1.462
#2 versicolor 4.260
#3 virginica 5.552
# 按照 Species 拆分数据库,汇总一下,然后转换结果
# 到数组
unlist(daply(iris[ 4:5] .(Species) colwise(mean)))
# setosa.Petal.Width versicolor.Petal.Width virginica.Petal.Width
# 0.246 1.326 2.026
4. stringrR基础库的字符串功能使用起来非常困难和麻烦。stringr软件包提供了一些非常需要的字符串运算符。很多函数使用那些做基础分析时不常用的数据结构。
stringr 非常易于使用。几乎所有的(和所有的重要功能)都以”str”为前缀,所以很容易记住。
install.packages("stringr")
library(stringr)
names(iris)
#[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
names(iris) <- str_replace_all(names(iris) "[.]" "_")
names(iris)
#[1] "Sepal_Length" "Sepal_Width" "Petal_Length" "Petal_Width" "Species"
s <- c("Go to Heaven for the climate Hell for the company.")
str_extract_all(s "[H][a-z] ")
#[[1]]
#[1] "Heaven " "Hell "
5. 数据库驱动的包install.packages("RPostgreSQL")
install.packages("RMySQL")
install.packages("RMongo")
install.packages("RODBC")
install.packages("RSQLite")
R对于几乎每一个可以想到的数据库都有好的驱动。当你在偶尔使用不具有独立驱动程序的数据库(SQL Server)时,你可以随时使用RODBC。
library(RPostgreSQL)
drv <- dbDriver("PostgreSQL")
db <- dbConnect(drv dbname="ncaa"
user="YOUR USER NAME" password="YOUR PASSWORD")
q <- "SELECT
*
FROM
game_scores;"
data <- dbGetQuery(db q)
head(data)
#id school game_date spread school_score opponent opp_score was_home
#1 45111 Boston College 1985-11-16 6.0 21 Syracuse 41 False
#2 45112 Boston College 1985-11-02 13.5 12 Penn State 16 False
#3 45113 Boston College 1985-10-26 -11.0 17 Cincinnati 24 False
#4 45114 Boston College 1985-10-12 -2.0 14 Army 45 False
#5 45115 Boston College 1985-09-28 5.0 10 Miami 45 True
#6 45116 Boston College 1985-09-21 6.5 29 Pittsburgh 22 False
nrow(data)
#[1] 30932
ncol(data)
#[1] 8
完成了完美的查询后,只需要粘贴到R里面,即可使用 RPostgreSQL RMySQL RMongo SQLite 或 RODBC执行。不仅可以避免生成数以百计的CSV文件,在R中运行查询还可以节省I/O和转换数据类型的时间。日期,时间等会自动设置为R中的等价表示。它还使你的R脚本可重复,因此我们团队中的其他人可以轻松获得相同的结果。
6. lubridate在R中处理日期我往往使用POSIXs和R内建日期类型合作的方法。另外一种高效的方法就是使用用 lubridate。
lubridate 是那些似乎完全按照我们期望的神包之一。这些函数都有易懂的名字如 year month ymd 和 ymd_hms。对于熟悉javascript的人来说,它类似于Moment.js 。
install.packages("lubridate")
library(lubridate)
year("2012-12-12")
#[1] 2012
day("2012-12-12")
#[1] 12
ymd("2012-12-12")
#1 按照 %Y-%m-%d 的方式解析
#[1] "2012-12-12 UTC"
7. ggplot2ggplot2在每个人“喜爱的R包”的列表中排名很高。 它很容易使用,并且产生一些很好看的图像。 这是介绍我们工作的好方法,有很多资源可以帮助我们开始使用。
8. qccqcc 是用于 统计质量控制的库。 早在上世纪五十年代,现已不复存在的西方电气公司正在寻找一种更好检测电话线和电线问题的方法。他们提出了一系列 规则 来帮助识别有问题的线。规则观察一系列数据点的历史平均值,并且基于标准差的偏差,该规则有助于判断一组新的点是否经历均值漂移。
install.packages("qcc")
library(qcc)
# 均值为10的序列,加上白噪声
x <- rep(10 100) rnorm(100)
# 测试序列,均值为11
new.x <- rep(11 15) rnorm(15)
# qcc 会标记出新的点
qcc(x newdata=new.x type="xbar.one")
qcc可帮我们监控网站的交易量,数据库的访问者或者登录名,以及其他许多流程。
9. reshape2我们经常发现,任何分析中最难的部分是把数据转化成正确的格式。 reshape2 专门用于 “宽”数据表 和“窄”数据表 的转换。一般会和ggplot2 及 plyr一起使用它。
install.packages("reshape2")
library(reshape2)
# 为每一行生成唯一的ID; 这样我们可以稍后转回到宽格式
iris$id <- 1:nrow(iris)
iris.lng <- melt(iris id=c("id" "Species"))
head(iris.lng)
# id Species variable value
#1 1 setosa Sepal.Length 5.1
#2 2 setosa Sepal.Length 4.9
#3 3 setosa Sepal.Length 4.7
#4 4 setosa Sepal.Length 4.6
#5 5 setosa Sepal.Length 5.0
#6 6 setosa Sepal.Length 5.4
iris.wide <- dcast(iris.lng id Species ~ variable)
head(iris.wide)
# id Species Sepal.Length Sepal.Width Petal.Length Petal.Width
#1 1 setosa 5.1 3.5 1.4 0.2
#2 2 setosa 4.9 3.0 1.4 0.2
#3 3 setosa 4.7 3.2 1.3 0.2
#4 4 setosa 4.6 3.1 1.5 0.2
#5 5 setosa 5.0 3.6 1.4 0.2
#6 6 setosa 5.4 3.9 1.7 0.4
library(ggplot2)
# 为数据集中每个数值列绘制直方图
p <- ggplot(aes(x=value fill=Species) data=iris.lng)
p geom_histogram()
facet_wrap(~variable scales="free")
这是一个快速查看数据集并且获得转接的方法。我们可以使用 melt 函数将宽数据转换为窄数据, 使用 dcast 将窄数据转换为宽数据。
随机森林 是一个很好的算法。它很容易使用,可以进行监督学习或者无监督学习,它可以与许多不同类型的数据集一起使用,但最重要的是它的高效率!这是它在R中的使用方法。
install.packages("randomForest")
library(randomForest)
# 下载泰坦尼克号幸存者数据集
data <- read.table("http://math.ucdenver.edu/RTutorial/titanic.txt" h=T sep="\t")
# 将Survived列转为yes/no因子
data$Survived <- as.factor(ifelse(data$Survived==1 "yes" "no"))
# 拆分为训练集和测试集
idx <- runif(nrow(data)) <= .75
data.train <- data[idx ]
data.test <- data[-idx ]
# 训练一个随机森林
rf <- randomForest(Survived ~ PClass Age Sex
data=data.train importance=TRUE na.action=na.omit)
# 模型中每个变量的重要程度
imp <- importance(rf)
o <- order(imp[ 3] decreasing=T)
imp[o ]
# no yes MeanDecreaseAccuracy MeanDecreaseGini
#Sex 51.49855 53.30255 55.13458 63.46861
#PClass 25.48715 24.12522 28.43298 22.31789
#Age 20.08571 14.07954 24.64607 19.57423
# 混淆矩阵 [[真反例 假正例] [假反例 正正例]]
table(data.test$Survived predict(rf data.test) dnn=list("actual" "predicted"))
# predicted
#actual no yes
# no 427 16
# yes 117 195