首页 > 代码库 > 《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等,译者高涛、肖楠、陈钢