Advanced R 取子集操作

取子集操作

R 语言的取子集操作既强大又迅速。 掌握了取子集操作可以让你实现其它语言无 法完成的复杂操作。 学习取子集操作比较难,因为你需要掌握许多相关的概念:

  • 三种取子集的符号
  • 六种类型的取子集的方式
  • 不同对象取子集操作的区别
  • 赋值与取子集操作的同时进行

首先,使用[为原 子向量取子集,然后逐渐扩展你的知识,转到更复杂的数据类型(如数组和列表); 然后,转到其它取子集操作符,[[和$。 然后,你将学习如何把取子集操作和赋值操作结合起来,用来修改对象的某一部分;最后,你将看到许多有用的应用。

取子集操作是 str()函数的补充操作,str()向你展示了对象的结构,取子集操作则 可以让你取出对象中感兴趣的部分。

向量

有五种方式对向量进行取子集操作:

  1. 正整数返回该位置的元素
x[c(3, 1)]
#> [1] 3.3 2.1
  1. 负整数忽略该位置的元素:
 x[-c(3, 1)]
#> [1] 4.2 5.4
  1. 逻辑向量选出对应位置为 TRUE 的元素。 当你使用表达式来创建逻辑向量 时,这种方法可能是最有用的:
x[c(TRUE, TRUE, FALSE, FALSE)]
#> [1] 2.1 4.2

需要注意的是,缺失值总是在输出中产生缺失值

  1. 什么都不写,则返回原始向量。 它对向量不是那么有用,但是对于矩阵、数 据框和数组是非常有用的。 它与赋值操作结合起来时,也挺有用的

  2. 0 返回零长度的向量。 我们通常不会这么做,但是在产生测试数据时,会有 点用处。

  3. 字符向量,将返回名字与该字符匹配的元素。

(y <- setNames(x, letters[1:4]))
#> a b c d
#> 2.1 4.2 3.3 5.4
y[c("d", "c", "a")]

列表

对列表进行取子集操作与原子向量相同。 使用[将总是返回一个列表;使用[[和$,如下所述,则让你取出列表的一部分。

矩阵与数组

你可以通过三种方式对更高维的结构进行取子集操作:

  1. 使用多个向量
  2. 使用单个向量
  3. 使用矩阵

数据框

数据框既具有列表的特点,又具有矩阵的特点:如果你用一个向量对它们进行取子集操作,则它们表现得像列表;如果你用两个向量对它们进行取子集操作,则它们看起来像矩阵。

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,是编程 中最常见的错误来源之一。

image.png

取子集与赋值

所有的取子集操作符都可以与赋值操作结合起来使用,用以修改输入向量中被选定的值。

词汇表

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

推荐阅读更多精彩内容