取子集操作
R 语言的取子集操作既强大又迅速。 掌握了取子集操作可以让你实现其它语言无 法完成的复杂操作。 学习取子集操作比较难,因为你需要掌握许多相关的概念:
- 三种取子集的符号
- 六种类型的取子集的方式
- 不同对象取子集操作的区别
- 赋值与取子集操作的同时进行
首先,使用[为原 子向量取子集,然后逐渐扩展你的知识,转到更复杂的数据类型(如数组和列表); 然后,转到其它取子集操作符,[[和$。 然后,你将学习如何把取子集操作和赋值操作结合起来,用来修改对象的某一部分;最后,你将看到许多有用的应用。
取子集操作是 str()函数的补充操作,str()向你展示了对象的结构,取子集操作则 可以让你取出对象中感兴趣的部分。
向量
有五种方式对向量进行取子集操作:
- 正整数返回该位置的元素
x[c(3, 1)]
#> [1] 3.3 2.1
- 负整数忽略该位置的元素:
x[-c(3, 1)]
#> [1] 4.2 5.4
- 逻辑向量选出对应位置为 TRUE 的元素。 当你使用表达式来创建逻辑向量 时,这种方法可能是最有用的:
x[c(TRUE, TRUE, FALSE, FALSE)]
#> [1] 2.1 4.2
需要注意的是,缺失值总是在输出中产生缺失值
什么都不写,则返回原始向量。 它对向量不是那么有用,但是对于矩阵、数 据框和数组是非常有用的。 它与赋值操作结合起来时,也挺有用的
0 返回零长度的向量。 我们通常不会这么做,但是在产生测试数据时,会有 点用处。
字符向量,将返回名字与该字符匹配的元素。
(y <- setNames(x, letters[1:4]))
#> a b c d
#> 2.1 4.2 3.3 5.4
y[c("d", "c", "a")]
列表
对列表进行取子集操作与原子向量相同。 使用[将总是返回一个列表;使用[[和$,如下所述,则让你取出列表的一部分。
矩阵与数组
你可以通过三种方式对更高维的结构进行取子集操作:
- 使用多个向量
- 使用单个向量
- 使用矩阵
数据框
数据框既具有列表的特点,又具有矩阵的特点:如果你用一个向量对它们进行取子集操作,则它们表现得像列表;如果你用两个向量对它们进行取子集操作,则它们看起来像矩阵。
df <- data.frame(x = 1:3, y = 3:1, z = letters[1:3])
df[df$x == 2, ] #> x y z
#> 2 2 2 b df[c(1, 3), ]
#> x y z
#> 1 1 3 a
#> 3 3 1 c
# 从数据框中选择列,有两种方法 # 像列表:
df[c("x", "z")]
#> x z
#> 1 1 a
#> 2 2 b
#> 3 3 c
# 像矩阵
df[, c("x", "z")] #> x z
#> 1 1 a
#> 2 2 b
#> 3 3 c
# 如果你选择单个列,那么有重要的区别:
# 默认情况下,矩阵的**取子集操作**会对结果进行简化,
# 而列表却不是这样。 str(df["x"])
#> 'data.frame': 3 obs. of 1 variable: #> $ x: int 1 2 3
str(df[, "x"])
#> int [1:3] 1 2 3
s3 对象
S3 对象是由原子向量、数组和列表组成的,所以你可以使用上面描述的技术对 S3对象进行取子集操作。 你可以通过 str()函数获得的它们的结构信息
s4对象
对 S4 对象来说,有另外两种取子集操作符: @(相当于)和 slot()(相当于[[)。 @比更加严格,如果槽(slot)不存在,那么它会返回错误。
取子集操作符
还有另外两个取子集操作符:[[和。 除了只能返回单个值以外,[[与[是类似的, 它还可以用于取出列表的一部分。 当通过字符进行取子集操作时,是[[一种有用 的简化写法。
对列表进行操作时,需要[[。 这是因为当[应用于列表时,总是返回列表:它从来 不会返回列表包含的内容。 为了获得列表的内容,需要使用[[:
"如果列表 x 是一列载有对象的火车的话,那么 x[[5]]就是在第 5 节车厢里的对 象;而 x[4:6]就是第 4-6 节车厢。" ——@RLangTip
因为数据框是包含一些列的列表,所以可以对数据框使用[[来提取列: mtcars[[1]]、mtcars[["cyl"]]。 S3 和 S4 对象则可以覆盖[和[[的标准行为,对于不 同类型的对象,它们的行为会有所不同。 关键的区别,通常是你在"简化"或"保持" 行为之间如何进行选择,以及默认的行为是什么。
简化(simplifying)和保持(preserving)
所谓简化与保持,即取子集操作之后是否把结果转化为更简单的数据类型,比如取出数 据框的一列,如果选择简化,则返回的是向量,如果选择保持,则返回的仍然是数据框
"简化"取子集操作,将返回可以表示输出并且尽可能简单的数据结构,在 交互环境下,这是有用的,因为它通常能给你想要的结果。 "保持"取子集操作, 使输出与输入的结构保持相同,在编程环境下,通常是更好的,因为结果将永远是 相同的类型。 在对矩阵和数据框进行取子集操作时忽略了 drop = FALSE,是编程 中最常见的错误来源之一。
取子集与赋值
所有的取子集操作符都可以与赋值操作结合起来使用,用以修改输入向量中被选定的值。
词汇表
基础
# 首先要学习的函数
? str
# 重要的运算符和赋值函数 %in%, match
=, <-, <<-
$, [, [[, head, tail, subset with
assign, get
# 比较
all.equal, identical
!=, ==, >, >=, <, <= is.na, complete.cases is.finite
# 基本数学函数
*, +, -, /, ^, %%, %/%
abs, sign
acos, asin, atan, atan2
sin, cos, tan
ceiling, floor, round, trunc, signif
exp, log, log10, log2, sqrt
max, min, prod, sum
cummax, cummin, cumprod, cumsum, diff pmax, pmin
range
mean, median, cor, sd, var rle
# 用于函数的函数 function
missing
on.exit
return, invisible
# 逻辑和集合
&, |, !, xor
all, any
intersect, union, setdiff, setequal which
# 向量和矩阵 c, matrix
# 自动强制转换规则 character > numeric > logical
length, dim, ncol, nrow
cbind, rbind
names, colnames, rownames
t
diag
sweep
as.matrix, data.matrix
# 创建向量 c
rep, rep_len
seq, seq_len, seq_along Vocabulary 59
rev
sample
choose, factorial, combn (is/as).(character/numeric/logical/...)
# 列表和数据框
list, unlist
data.frame, as.data.frame
split
expand.grid
# 控制流
if, &&, || (short circuiting)
for, while next, break
switch
ifelse
# apply 族函数
lapply, sapply, vapply apply
tapply
replicate
通用数据结构
# 日期与时间
ISOdate, ISOdatetime, strftime, strptime, date difftime
julian, months, quarters, weekdays library(lubridate)
# 字符操作 grep, agrep
gsub strsplit chartr nchar
tolower, toupper
substr
paste library(stringr)
# 因子
factor, levels, nlevels
reorder, relevel
cut, findInterval
interaction
options(stringsAsFactors = FALSE)
# 数组操作 array
dim
dimnames aperm library(abind)
统计学
# 排序与制表
duplicated, unique merge
order, rank, quantile sort
table, ftable
# 线性模型
fitted, predict, resid, rstandard
lm, glm
hat, influence.measures logLik, df, deviance formula, ~, I
anova, coef, confint, vcov contrasts```
概率
随机变量
(q, p, d, r) * (beta, binom, cauchy, chisq, exp, f, gamma, geom, hyper, lnorm, logis, mul tinom, nbinom, norm, pois, signrank, t, unif, weibull, wilcox, birthday, tukey)
# 矩阵代数 crossprod, tcrossprod
eigen, qr, svd %*%, %o%, outer
rcond
solve
工作函数
4.4 使用 R 语言工作
# 工作空间
ls, exists, rm
getwd, setwd
q
source
install.packages, library, require
# 帮助
help, ? help.search apropos RSiteSearch citation demo
example
vignette
# 调试
traceback
browser
recover
options(error = )
stop, warning, message tryCatch, try
输入输出
# 输出
print, cat
message, warning dput
format
sink, capture.output
# 读写数据 data count.fields
read.csv, write.csv
read.delim, write.delim read.fwf
readLines, writeLines readRDS, saveRDS load, save library(foreign)
# 文件和路径
dir
basename, dirname, tools::file_ext
file.path
path.expand, normalizePath
file.choose
file.copy, file.create, file.remove, file.rename, dir.create file.exists, file.info
tempdir, tempfile
download.file, library(downloader)