取子集
R的取子集操作非常快捷灵活。掌握R中的取子集操作能让你用简洁的方式对数据进行复杂的操作,这是其他编程语言所望成莫及的。R的取子集不是那么容易学习,这之前你需要先了解几个相关的概念:
-
三个取子集操作符。
-
六种取子集的索引方法。
-
对不同数据类型(比如向量,列表,因子,矩阵和数据框)取子集结果的不同。
-
取子集和任务分派的结合使用。
这章将帮助你一步一步掌握R的取子集操作。首先我们从最简单的取子集(即使用[
对原子向量取子集)开始讲解,然后慢慢展开,学习对较复杂的数据结构比如数组和列表取子集以及使用其他取子集操作符[[
和$
。接下来会讲解如何结合取子集和任务分派来修改对象的内容。最后我们来看看一些有用的取子集应用实例。
取子集是str()
函数的补充。str()
函数帮助你了解对象的数据结构,取子集让你从对象中提取感兴趣的数据片段。
测试
做做这个简单的测试看看你是否需要阅读本章内容。如果你能很快地得到答案,你可以轻松地跳过本章。本章最后提供参考答案。
-
使用正数索引,负数索引,逻辑向量索引以及字符串向量索引取子集分别有什么不同?
-
对列表使用
[
,[[
或者$
有什么不同? -
什么时候需要使用
drop = FALSE
? -
如果
x
是一个矩阵,x[] <- 0
会得到什么结果,这和x <- 0
的结果有什么不同? -
如何使用向量的名字来重新标记分类变量?
概要
-
数据结构 首先介绍如何使用
[
以及六种对原子向量取子集的索引方法。然后讲解如何将这六种索引方法应用到列表,矩阵,数据框和S3对象。 -
取子集操作符 介绍另外两种取子集操作符
[[
和$
,着重介绍简化与保留的原则。 -
在取子集和任务分派学习子分配的艺术,结合使用取子集和分派来修改对象的部分类容。
-
实例运用 带你了解数据分析中取子集的八种常见运用。
索引类型
学习原子向量的取子集是最简单的,原子向量的取子集操作可以很容易地被引申运用到高维和其他更复杂的数据结构。这里我们将从最常用的取子集操作符[
开始讲解。后面的取子集操作符一节会介绍另外两种操作符,[[
和$
。
原子向量
以下用一个简单的向量x
来讲解不同的取子集方式。
x <- c(2.1, 4.2, 3.3, 5.4) #注意:小数点后面的数实际标明了向量中元素的位置。
你可以用如下六种索引方式对一个向量进行取子集操作:
-
正整数索引 返回向量中特定位置的元素:
x[c(3, 1)] x[order(x)]# 重复的索引返回重复的值x[c(1, 1)]# 实数默认被去尾为整数x[c(2.1, 2.9)]
-
负整数索引 去除向量中特定位置的元素:
x[-c(3, 1)]
正整数和负整数不可以在同一个取子集操作中结合使用:
x[c(-1, 2)]
-
逻辑向量索引 选择对应值为
TRUE
的元素。这可能是最有用的取子集操作,因为你在代码中常常得到逻辑向量。x[c(TRUE, TRUE, FALSE, FALSE)] x[x > 3]
如果使用的逻辑向量的长度比被取子集的向量长度短,逻辑向量会被循环到与该向量相同的长度。
x[c(TRUE, FALSE)]# 等同于x[c(TRUE, FALSE, TRUE, FALSE)]
索引中如果出现缺失值,结果中也会对应返回缺失值:
x[c(TRUE, TRUE, NA, FALSE)]
-
空索引 返回原向量。这对向量取子集没有什么用处,可是对于矩阵,数据框和数组却非常有用。并且还可以和任务分派联合使用。
x[]
-
零索引 返回一个长度为零的向量。这个不常用,但是可以用来生成测试数据。
x[0]
-
字符串向量索引 如果向量有名字,你也可以使用字符串向量索引返回与名字相匹配的元素:
(y <- setNames(x, letters[1:4])) y[c("d", "c", "a")]# 和整数索引一样,你也可以使用重复字符串y[c("a", "a", "a")]# 使用[取子集时,名字必须是完全匹配的z <- c(abc = 1, def = 2) z[c("a", "d")]
列表
对列表取子集与对原子向量取子集原理相同。使用[
将会始终返回一个向量;后面要讲解的[[
和$
则会提取一个向量中的元素。
矩阵和数组
可以使用如下三种方法对高维数据取子集:
-
多个向量
-
单个向量
-
矩阵
最常用的对矩阵和数组取子集就是对一维向量取子集的简单衍生,即对每一个维度提供一个用逗号彼此隔开的索引。空索引这时就有用处了,它意味着保留所有行,或者所有列。