赞
踩
专注系列化、高质量的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
的值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。