专注系列化、高质量的R语言教程
(查看推文索引)
中括号[]
是R语言的一个常用操作符,作用是提取(extract)或替换(replace)。本篇推文总结其三种用法:
1 使用下标或名称
2 使用逻辑变量
3 使用重复序数
1 使用下标或名称
在推文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 360mtcars[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
2 使用逻辑变量
这种方法仅适用于行的提取或替换,逻辑变量的长度需要与数据的行数一致:
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 0mtcars[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 FALSEmtcars[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
3 使用重复序数
这种用法不太常见,主要用于替换,学堂君认为这算是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 2c(-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 0c("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 <- mtcarsy <- 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 2data$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
的值。
来源地址:https://blog.csdn.net/weixin_54000907/article/details/127626417