专注系列化、高质量的R语言教程
(查看推文索引)
中括号[]
是R语言的一个常用操作符,作用是提取(extract)或替换(replace)。本篇推文总结其三种用法:
1 使用下标或名称
2 使用逻辑变量
3 使用重复序数
在推文R语言的原子类型和数据结构中,学堂君介绍了五种基本数据结构都可以使用中括号[]
来提取(查询)、替换元素。
以数据框为例,中括号内可以使用行、列的下标或名称:
mtcars[1:5,1:3]
## mpg cyl disp
## Mazda RX4 21.0 6 160
## Mazda RX4 Wag 21.0 6 160
## Datsun 710 22.8 4 108
## Hornet 4 Drive 21.4 6 258
## Hornet Sportabout 18.7 8 360
mtcars[1:5, c("mpg", "disp", "cyl")]
## mpg disp cyl
## Mazda RX4 21.0 160 6
## Mazda RX4 Wag 21.0 160 6
## Datsun 710 22.8 108 4
## Hornet 4 Drive 21.4 258 6
## Hornet Sportabout 18.7 360 8
对于数据框而言,如果使用单索引指的是列:
mtcars[1:3]
## mpg cyl disp
## Mazda RX4 21.0 6 160.0
## Mazda RX4 Wag 21.0 6 160.0
## Datsun 710 22.8 4 108.0
## Hornet 4 Drive 21.4 6 258.0
## Hornet Sportabout 18.7 8 360.0
对于矩阵而言,如果使用单索引,1表示其第一列第一行的元素,2表示其第一列第二行的元素,3表示其第一列第三行的元素;第一列数完后则从第二列第一行开始继续数,依次类推。例如:
mat <- as.matrix(mtcars)
mat[1:3]
## [1] 21.0 21.0 22.8
这种方法仅适用于行的提取或替换,逻辑变量的长度需要与数据的行数一致:
x <- c(1,1, rep(0, 30))
x
## [1] 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
mtcars[x,]
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21 6 160 110 3.9 2.62 16.46 0 1 4 4
## Mazda RX4.1 21 6 160 110 3.9 2.62 16.46 0 1 4 4
x
中只有前两个元素为1(对应逻辑值TRUE),则表示提取数据的前两行。
其拓展形式是使用逻辑判定式(结果也是逻辑变量):
mtcars$mpg > 25
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
## [25] FALSE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
mtcars[mtcars$mpg > 25,]
## mpg cyl disp hp drat wt qsec vs am gear carb
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
这种用法不太常见,主要用于替换,学堂君认为这算是R语言基础的一个隐藏技巧。
生成一个由重复序数组成的向量作为索引:
set.seed(1030)
x <- sample(1:3, 32, replace = T)
x
## [1] 2 1 2 3 2 2 1 2 1 3 3 2 1 2 1 1 3 1 3 1 2 1 3 1 1 1 3 2 3 1 2 2
c(-1, 0, 1)[x]
## [1] 0 -1 0 1 0 0 -1 0 -1 1 1 0 -1 0 -1 -1 1 -1 1 -1 0 -1 1 -1 -1
## [26] -1 1 0 1 -1 0 0
c("good", "better", "best")[x]
## [1] "better" "good" "better" "best" "better" "better" "good" "better"
## [9] "good" "best" "best" "better" "good" "better" "good" "good"
## [17] "best" "good" "best" "good" "better" "good" "best" "good"
## [25] "good" "good" "best" "better" "best" "good" "better" "better"
例1:生成一个变量用于标记每行数据对应的mpg
变量的四分位数。
data <- mtcars
y <- cut(data$mpg, breaks = quantile(data$mpg), include.lowest = T)
y <- as.numeric(y)
y
## [1] 2 1 2 3 2 2 1 2 1 3 3 2 1 2 1 1 3 1 3 1 2 1 3 1 1 1 3 2 3 1 2 2
data$Q <- c("Q1", "Q2", "Q3", "Q4")[y]
data$Q
## [1] "Q2" "Q1" "Q2" "Q3" "Q2" "Q2" "Q1" "Q2" "Q1" "Q3" "Q3" "Q2" "Q1" "Q2" "Q1"
## [16] "Q1" "Q3" "Q1" "Q3" "Q1" "Q2" "Q1" "Q3" "Q1" "Q1" "Q1" "Q3" "Q2" "Q3" "Q1"
## [31] "Q2" "Q2"
例2:已知前面的随机变量x
中的元素只包含1、2、3。生成一个变量:当x = 1
时它取mpg
的值;当x = 2
时,它取cyl
的值;当x = 3
时,它取disp
的值。