《R语言实战》学习笔记及代码(第四章)

感谢Robert I.Kabacoff 著作本书,同时感谢高涛、肖楠、陈钢编译此书。

最近在学习《R语言实战》,特将学习过程记录下来,供各位朋友参考,虽说是笔记,但是90%是书中内容,另外10%是自己偶尔冒出的一点点想法的记录和一些疑问,希望互相探讨。末尾有本章的代码清单下载地址,与各位交流,还是提倡按照书中内容把代码一个个敲出来。

第四章 基本数据管理



本章内容

操纵日期和缺失值

熟悉数据类型的转换

变量的创建和重编码

数据集的排序,合并与取子集

选入和丢弃变量




4.1 一个示例

代码清单中,最后一行的最后一个参数,stringsAsFactors = FALSE,个人认为含义是:特征向量能否转换为因子,默认TRUE,可以转换。R中解释为:

stringsAsFactors

logical: should character vectors be converted to factors? The ‘factory-fresh’ default is TRUE, but this can be changed by setting options(stringsAsFactors = FALSE)




4.2 创建新变量

在R中,算数运算符除了+、-、*、/,还有

^(或 **):求幂。

x%%y:求余,5%%2的结果为1。

x%/%y:整数除法,5%/%2的结果为2。

代码清单4-2提供了三种将新变量整合到原始的数据框中的方式。相当于在列表中增加新的一列(新的观测)。作者推荐使用第三种方式,我个人也比较喜欢第三种,主要是简便并且不容易误操作。



4.3 变量的重编码

重编码涉及根据一个变量和/或其他变量的现有值创建新值得过程。

浮点型数据的概念和理解(百度百科)

P69页的第一句话是什么意思?

语句variable[condition] <- expression将仅在condition的值为TRUE时执行赋值。

解释:

variable 变量的

condition 条件

expression 表达式

仅在变量的条件为TRUE时进行赋值。

首先要执行“将99转换为缺失值NA”,其次在书中P69页执行第一段或者第二段代码。

函数within()与函数with()类似,不同的是它允许你修改数据框。



4.4变量的重命名

  1. 交互式方法。
      使用fix(数据框名)即可调出一个交互式的编辑器,可直接点击变量名进行修改。
  2. 编程的方法
      下载、载入reshape包,注意使用R 3.3.1版本。然后使用其中的rename()函数即可。

编程的方式也分为几种方法:

  1. 直接将旧名称换为新名称。

    data.frame <- rename(oldname = "newname", oldname = "newname", …)

  2. 指定变换的变量数字。

    names(data.frame)[2] <- "newname"

  3. 以向量的方式批量更换某一部分变量名。

    names(data.frame)[2:5] <- c("newname", "newname", …)



4.5 缺失值

is.na()将返回逻辑值TRUE(存在缺失值)和FALSE(不存在缺失值)。

注意:

  缺失值被认为是不可比较的,即便是与确实值自身的比较。这一位这无法使用比较运算符来检测缺失值是否存在。例如,逻辑测试myvar == NA的结果永远不会是TRUE。作为替代,你只能使用处理缺失值的函数(如本节中所述的那些)来识别R数据对象终归的缺失值。

4.5.1 重编码某些值为缺失值

如4.3节那样可以使用赋值语句将某些值重编码为缺失值。

leadership$age[leadership$age == 99] <- NA

请确保所有的缺失数据已在分析之前被妥善地编码为缺失值,否则分析结果将失去意义。

4.5.2 在分析中排出缺失值

缺失值需要以某种方式删除,因为含有缺失值的算术表达式和函数的计算结果也是缺失值。

多数数值函数拥有一个na.rm = TRUE的选项,可以在计算之前移除缺失值并使用剩余值进行计算。

x <- c(1, 2, NA, 3)<BR>
y <- sum(x, na.rm = TRUE)

在使用函数处理不完整的数据时,请务必查阅他们的帮助文档,检查这些函数是如何处理缺失数据的。

函数na.omit()可以移除所有含有缺失值的观测。

4.6 日期值

日期通常以字符串的方式输入到R中,然后转化为以数值形式存储的日期变量。函数as.Date()用于执行这种转化。其语法为:as.Date(x, "input_format")

在P73页中有一句话,个人觉得,翻译有误。原文为:

< 使用指定格式读取字符型变量,并将其作为一个日期变量替换到数据框中。

个人建议将第二句话改为:并将其修改成指定格式的数值型变量(指定的日期格式)。

时间戳
  1. Sys.Date()函数  返回当天的日期。
  2. date()函数    返回当前的日期和时间。

使用函数format(x, format = "output_format")来输出指定格式的日期值,并且可以提取日期值中的某些部分。

疑问

  在使用如下代码时,书中显示的是英文的非缩写月份,而在RStudio中是中文的月份。
today <- Sys.Date()

format(today, format = "%B %d %Y")

  书中显示的是:"December 01 2010"

而我操作时显示的是:"六月 29 2016"

format(today, "%A")

书中显示的是:"Wednesday"

而我操作时显示的是:"星期三"

difftime()函数用于计算时间间隔,并以星期、天、时、分、秒来表示。units = auto(自动)、secs(秒)、mins(分)、hours(时)、days(天)、weeks(星期)。

问:为何没有年为结果的参数选项?

4.6.1 将日期转换为字符型变量

strDate <- as.character(dates)

4.6.2 更进一步

要了解字符型数据转换为日期的更多细节,请查看help(as.Date)和help(strftime)。

要了解更多关于日期和时间格式的知识,请参考help(ISOdatetime)

lubridate包中包含了许多简化日期处理的函数,可以用于识别和解析日期-时间数据,抽取日期-时间成分(例如年份、月份、日期等),以及对日期-时间值进行算术运算。

如果你需要对日期进行复杂的计算,namefCalendar包可能会有帮助。它提供了大量的日期处理函数,可以同时处理多个时区,并且提供了历法操作功能,支持工作日、周末以及假期。



4.7 类型转换

名为is.datatype()这样的函数返回TRUE或FALSE,而as.datatype()这样的函数则将其参数转换为对应的类型。



4.8 数据排序

使用order()函数对一个数据框进行排序。默认的排序顺序是升序,在排序变量前边加一个减号,即可得到降序的排序结果。order()可以同时添加多个变量。

4.9 数据集的合并

如果数据分散在多个地方,你就需要在继续下一步之前将其合并。本节展示了向数据框中添加列(变量)和行(观测)的方法。

4.9.1 添加列

使用merge()函数可以,通过一个或多个共有变量合并数据框。

如下代码

ID <- c(1, 2, 3)
name1 <- c("a", "b", "c")
age1 <- c(11, 12, 13)
name2 <- c("d", "e", "f")
age2 <- c(14, 15, 16)
dataframe1 <- data.frame(ID, name1, age1)
dataframe1
dataframe2 <- data.frame(ID, name2, age2)
dataframe2
newdataframe <- merge(dataframe1, dataframe2, by = "ID")
newdataframe

以上是通过一个共有变量ID,合并两个数据框的。

newdataframe2 <- cbind(dataframe1, dataframe2)
newdataframe2

使用cbind()函数可以直接横向合并两个矩阵或数据框。

4.9.2 添加行

使用rbind()函数可以纵向合并两个数据框(数据集)。通常用于向数据框中添加观测。

注意

  1. 两个数据框必须拥有相同的变量,顺序可以不同。
  2. 如果数据框A中有数据框B没有的变量,请在合并之前做以下某种处理:
  • 删除A中的多余变量。
  • 在B中创建追加的变量并将其值设为NA(缺失)。

4.10 数据集取子集

R拥有强大的索引特性,可以用于访问对象中的元素。也可利用这些特性对变量或观测进行选入和排除。

4.10.1 选入(保留)变量

myvars3 <- names(leadership) %in% c("q3", "q4")
newdata4 <- leadership[!myvars3]
newdata4

(1) names(leadership)生成了一个包含所有变量名的字符型向量:c("manafer", "date", "country", "gender", "age", "q1", "q2", "q3", "q4", "q5")。

  (2) names(leadership) %in% c("q3", "q4")返回一个逻辑型向量,names(leadership)中每个匹配q3或q4的值为TRUE,反之为FALSE:c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE)。

  (3)运算符非(!)将逻辑值翻反转:c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE)。

  (4) leadership[c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE)]选择了逻辑值为TRUE的列,于是q3和q4倍剔除了。

在知道q3和q4是第八个和第九个变量的情况下,可以使用语句:

newdata <- leadership[c(-8, -9)]

将他们剔除。原理是:**在某一列的下标之前加一个减号(-)就会剔除那一列了。

相同的变量删除工作亦可通过:
leadership$q3 <- leadershi$q4 <- NULL来完成。

将q3和q4设为了未定义(NULL)。注意,NULL和NA是不同的。

4.10.3 选入观测

选入或剔除观测(行)通常是成功的数据准备和数据分析的一个关键方面。

代码清单4-6 选入观测

newdata <- leadership[1:3, ]

newdata

newdata <- leadership[which(leadership$gender == "M" & leadership$age > 30), ]

newdata



attach(leadership)

newdata <- leadership[which(gender == "M"& leadership$age > 30), ]

detach(leadership)

newdata

在以上的每个示例中,你只提供了行下标,并将列下标留空(故选入了所有列)。在第一个示例中,你选择了第一行到第三行(前三个观测)。

在第二个示例中,你选择了所有30岁以上的男性。让我们拆解这行代码以便理解它。

(1) 逻辑比较leadership$gender == "M" 生成了向量c(TRUE, FALSE, FALSE, TRUE, FALSE)。

(2) 逻辑比较leadership$age > 30 生成了向量c(TRUE, TRUE, FALSE, TRUE, TRUE)。

(3) 逻辑比较c(TRUE, FALSE, FALSE, TRUE, FALSE) & c(TRUE, TRUE, FALSE, TRUE, TRUE)生成了向量c(TRUE, FALSE, FALSE, TRUE, FALSE)。

(4) 函数which()给出了向量中值为TRUE元素的下标。因此,which(c(TRUE, FALSE, FALSE, TRUE, FALSE))生成了向量c(1, 4)。

(5) leadership[c(1, 4), ]从数据框中选择了第一个和第四个观测。这就满足了我们选取准则(30岁以上的男性)。

第三个示例使用了attach()函数,所以就不必再变量名前加上数据框名称了。

将研究范围限定子啊2009年1月1日到2009年12月31日之间收集的观测,使用以下代码:

leadership$date <- as.Date(leadership$date, "%m/%d/%y")

startdate <- as.Date("2009-01-01")

enddate <- as.Date("2009-12-31")

newdate <- leadership[wihch(leadershi$date >= startdate & leadership$date <= enddate), ]

4.10.4 subset()函数

使用subset()函数可以简便的选入观测。

冒号运算符“:”,表示从…到…,在书中表示选择保留的列。

4.10.5 随机抽样

sample()函数可以从数据集中(有放回或无放回地)抽取大小为n的一个随机样本。

sample()函数中的第一个参数是一个由要从中抽样的元素组成的向量,在这里,这个向量是1到数据框中观测的梳理,第二个参数是要抽取的元素数量,第三个参数表示无放回抽样。sample()函数会返回随机抽样得到的元素,之后可用于选择数据框中的行。

更进一步

R中拥有齐全的抽样工具,包括抽取和小郑调查样本(详见sampling包)以及分析复杂调查数据(详见survey包)的工具其他依赖于抽样的方法,包括自助法和重抽样统计方法,详见第11章。

4.11 使用SQL语句操作数据框

由于不会SQL以及没有数据库相关经验,故跳过此章。

4.12 小结


《R语言实战》第四章学习笔记及代码清单

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容