首页 > 代码库 > 《R语言实战》学习笔记fourth
《R语言实战》学习笔记fourth
又拖了好久继续写R 语言的学习笔记了啊
这次到了基本数据管理了,众所周知数据准备是数据分析的最重要的前提
书本是从一个例子开始本章的内容的,例子是一个类似调查问卷的
然后把回答标为从1到5,再进行分析(这让我想到了自学SPSS 的时候啊)
> manager <- c(1, 2, 3, 4, 5) > date <- c("10/24/08", "10/28/08", "10/1/08", "10/12/08", "5/1/09") > country <- c("US", "US", "UK", "UK", "UK") > gender <- c("M", "F", "F", "M", "F") > age <- c(32, 45, 25, 39, 99) > q1 <- c(5, 3, 3, 3, 2) > q2 <- c(4, 5, 5, 3, 2) > q3 <- c(5, 2, 5, 4, 1) > q4 <- c(5, 5, 5, NA, 2) > q5 <- c(5, 5, 2, NA, 1) > leadership <- data.frame(manager, date, country, gender, age, q1, q2, q3, q4, q5, stringAsFactors=FALSE)
其中,通过stringAsFactors = FALSE参数防止字符串的转换
然后是创建新变量了啊
R 中, 变量名 <- 表达式,在 R中也有算术运算符,下面的是常见的啊,完整版地可以执行demo(plotmath)
加+,减-,乘*,除/,求幂^或**,求余x%%y,整数除法x%/%y
> 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 > attach(mydata) 下列对象被屏蔽了_by_ .GlobalEnv: x1 > mydata$sumx <- x1 + x2 错误于`$<-.data.frame`(`*tmp*`, "sumx", value = http://www.mamicode.com/numeric(0)) : 替换数据里有0行,但数据有4 > mydata$meanx <- (x1 + x2)/2 错误于`$<-.data.frame`(`*tmp*`, "meanx", value = http://www.mamicode.com/numeric(0)) : 替换数据里有0行,但数据有4 > detach(mydata) > mydata <- transform(mydata, sumx = x1 + x2, meanx = (x1 + x2)/2)
这段代码里显示了3种赋值方式,作者推荐第三种方式,即transform( )函数的一个示例,原因当然是可以少打代码啊
接下来是变量的重编码
重编码涉及根据同一个变量和/或其它变量的现有值创建新值的过程,比如可以在以下运用啊
将一个连续型变量修改为一组类别值;将误编码的值替换为正确值;基于一组分数线创建一个表示及格/不及格的变量
要重编码数据,要用到R 的逻辑运算符,返回值为TRUE或FALSE(其实这句是废话)
基本的就不打了啊,其它的如 x或y:x | y, x和y: x&y,测试x是否为TRUE: isTRUE(x),特别提醒,等于: ==(浮点型数值时慎用)
例如,把leadership数据集的连续型变量age重编码为类别型变量agecat(Young, Middle Aged, Elder)
> leadership <- within(leadership, {+ + agecat <- NA+ + agecat[age > 75] <- "Elder"+ + agecat[age >= 55 & age <= 75] <- "Middle Aged"+ + agecat[age < 55] <- "Young"})
在这里要用到variable[condition] <- expression语句仅在condition的值为TRUE时执行赋值
其中函数within( )函数与函数with( )类似,不同的是它允许修改数据框
此外若干程序包提供了实用的变量重编码函数,car( )包中recode( )函数可以十分简便地重编码数值型、字符型向量或因子
doBy包也提供了一个函数recodevar( )
最后R 自带了cut( )函数,可将一个数值型变量按值域切割为多个区间,并返回一个因子
然后是变量的重命名
对于leadership数据集,可以用fix(leadership)来调用一个交互式的编辑器进行编辑
若以编程的方式,要用到reshape包的rename( )函数,格式为:
rename(dataframe, c(oldname="newname", oldname="newname",...)
> install.packages("reshape") > leadership <- rename(leadership, c(manager="managerID", date="testDate") > names(leadership)[2] <- "testDate" > names(leadership)
然后是缺失值
R 中缺失值以符号NA表示,不可能出现的值通过符号NaN来表示,R 中字符型和数值型数据使用的缺失值符号是相同的
R 中可以使用is.na( )函数允许检测缺失值是否存在
> y <- c(1, 2, 3, NA)
> is.na(y)
[1] FALSE FALSE FALSE TRUE
在分析中排除缺失值,可以用到na.rm=TRUE或na.omit( )可以移除缺失值
然后是日期值
日期值常以字符串的形式输入到R 到中,然后转化为以数值型形式存储的日期变量
日期格式为:数字表示的日期%d,缩写的星期日%a,非缩写星期名%A,月份%m,缩写的月份%b,非缩写月份%B,两位数的年份%y,四位数的年份%Y
函数as.Date( )可以用于上述的转化,语法为as.Date(x, "input_format"),x是字符型数据,input_format用于读入日期的适当格式
format( )函数可以用format(x, format="output_format")来输出指定格式的日期值,并且可以提取日期值的某些部分
将日期转换为字符型变量:as.character( )函数
复杂的运算可以用到lubridate包()
接下来是类型转换
类型转换函数有:
判断:is.numeric( )/character( )/vector( )/matrix( )/data.frame( )/factor( )/logical( )/datatype( )
转换:as.numeric( )/character( )/vector( )/matrix( )/data.frame( )/factor( )/logical( )/datatype( )
再然后是数据排序
可以用到order( )函数,默认排序顺序是升序,在排序变量前面加一个减号即可得到降序的排序结果
再然后是数据集的合并
添加列可以用到merge( )函数或cbind( )函数,添加行可以用rbind( )函数
例如:total <- merge(dataframeA, dateframeB, by=c("ID", "Country"))
total <- cbind/rbind(A, B)
数据集取子集
选入(保留)变量
通过dataframe[row indices, column indices]记号来访问,也可以用到paste( )函数
剔除(丢弃)变量
以例子为例:
> myvars <- names(leadership) %in% c("q3", "q4") > newdata <- leadership[!myvars] > leadership$q3 <- leadership$q4 <- NULL
选入观测
> newdata <- leadership[1:3,] > newdata <- leadership[which(leadership$gender=="M"&leadership$age > 30),] > attach(leadership) > newdata <- leadership[which(gender=="M"&age>30),] > detach(leadership)
此外subset( )函数是一种最简单的方法
> newdata <- subset(leadership, age>=35 | age<24, select=c(q1,q2,q3,q4))
随机抽样是在数据挖掘和机器学习里从大数据集中抽样的常见做法
sample( )函数可以从数据集中(有放回或无放回地)抽取大小为n的一个样本
> mysample <- leadership[sample(1:nrow(leadership),3,replace=FALSE),]
此外,R 还有更强大的sampling包
接下来介绍一下R 与 SQL的结合
这里要用到sqldf包
> library(sqldf) 载入需要的程辑包:gsubfn 载入需要的程辑包:proto 载入需要的程辑包:RSQLite 载入需要的程辑包:DBI 载入需要的程辑包:RSQLite.extfuns > newdf <- sqldf("select * from mtcars where carb=1 order by mpg",+ + row.names=TRUE) 错误: 意外的‘=‘ in: "newdf <- sqldf("select * from mtcars where carb=1 order by mpg",+ row.names=" > newdf <- sqldf("select * from mtcars where carb=1 order by mpg", row.names=TRUE) Loading required package: tcltk > newdf mpg cyl disp hp drat wt qsec vs am gear carb Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1 Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1 Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1 > sqldf("select avg(mpg) as avg_mpg, avg(disp) as avg_disp, gear from mtcars where cyl in (4,6) group by gear") avg_mpg avg_disp gear 1 20.33333 201.0333 3 2 24.53333 123.0167 4 3 25.36667 120.1333 5
最后的最后,感谢作者Rober I. Kabacoff等,译者高涛、肖楠、陈钢