在R语言中,通常有一些操作符可以来提取对象的子集,如以下三种:
1、“[” 单层方括号,返回的对象与原对象类型相同,它也可以返回一个对象中的多个元素;
2、“[[” 双层方括号,用来从列表(list)或数据框(data frame)中提取元素;也可从列表或数据框中提取单个元素,且返回对象的类型可以不为列表和数据框;
3、“$” 美元符号,通过元素名称从列表和数据框中提取元素,“$”和“[[”作用相似,提出的子集与源对象的类型可能相同也可能不同。
既然提到了向量,首先简单介绍理解下向量的概念:
vector(mode = “logical”, length = 0L)
这里有两个参数: 类型(mode)和长度(length),mode参数表示的是该向量储存数据的类型,length表示该向量的长度。vector()函数可以创建一个特定类型和长度的向量,默认情况下,会使用缺省值来初始化这个向量:
> x <- vector("numeric", length = 10) > x[1] 0 0 0 0 0 0 0 0 0 0 # 对于数值向量,缺省值为0
也可以用函数c()(concatenate)来创建向量,实际上就是将一些对象组合成一个向量,同一向量内的对象类型必须相同:
> x <- c(0.5, 0.6) ## numeric> x <- c(TRUE, FALSE) ## logical> x <- c(T, F) ## logical> x <- c("a", "b", "c") ## character> x <- 9:29 ## integer > x <- c(1+0i, 2+4i) ## complex(i代表复数的虚部)
向量可以使用数字引号提取子集,或逻辑引号;可提取单个元素,或多个元素,也可以在“[]”设置条件,提取对应元素:
> x <- c("a", "b", "c", "c", "d", "a") > x[1] # 数字引号,单个提取 [1] "a" > x[2] [1] "b" > x[1:4] # 多个元素提取[1] "a" "b" "c" "c" > x[x > "a"] # 条件提取[1] "b" "c" "c" "d" > u <- x > "a" > u [1] FALSE TRUE TRUE TRUE TRUE FALSE > x[u] # 逻辑提取 [1] "b" "c" "c" "d"
一个矩阵实际上是有一个维数 dim 属性的向量,维数即为一个长度为2的向量,用来指定矩阵的行数和列数。 一个矩阵可以用函数matrix来创建:
matrix (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
data 表示向量要储存的数据,nrow和ncol是矩阵行数和列数,选项byrow表示数据给出的值是要按列填充(缺省值)还是按行填充(如果为TRUE) 。可以通过选项dimnames给行列命名:
> m <- matrix(nrow = 2, ncol = 3) # 创建空矩阵> m # 初始值为NA,矩阵中没有值 [,1] [,2] [,3] [1,] NA NA NA [2,] NA NA NA> dim(m) # 返回矩阵的维度属性 [1] 2 3
也可以先创建向量,再通过dim()函数为向量创建维度属性来创建矩阵:
> m <- 1:10 > m [1] 1 2 3 4 5 6 7 8 9 10 > dim(m) <- c(2, 5)> m [,1] [,2] [,3] [,4] [,5] #默认情况下,矩阵按列填充[1,] 1 3 5 7 9[2,] 2 4 6 8 10
通常会用 x[i,j] 行列索引来提取矩阵第i行第j列的值,要访问一个给定的行或列中所有的值, 只要忽略适当的下标( 不要忘记逗号):
> x <- matrix(1:6, 2, 3)> x [,1] [,2] [,3][1,] 1 3 5[2,] 2 4 6> x[1, 2][1] 3> x[2, 1][1] 2> x[1, ] # 取某一行,可省略列索引[1] 1 3 5> x[, 2] # 取某一列,可省略行索引[1] 3 4
属性drop默认值为TRUE,返回的是一个一维对象;将属性drop=FALSE,保持对象的维度,则返回一个1×1的矩阵:
> x <- matrix(1:6, 2, 3)> x[1, 2] [1] 3 #返回单个元素 > x[1, 2, drop = FALSE][,1][1,] 3 #返回1×1的矩阵
默认情况下,取单列和单行返回的是向量:
> x <- matrix(1:6, 2, 3)> x[1, ][1] 1 3 5 #返回第一行,向量化 > x[1, , drop = FALSE][,1] [,2] [,3] #设置drop = FALSE,返回第一行,是矩阵形式 [1,] 1 3 5
列表(list)是R的数据类型中最为复杂的一种。一般来说,列表就是一些对象的有序集合。列表允许整合若干对象到单个对象名下。例如,某个列表中可能是若干向量、矩阵、数据框,甚至其他列表的组合。可以使用函数list()创建列表:
list (object1, object2…)
列表的每个元素可以是不同类型的对象:
> x <- list(1, "a", TRUE, 1 + 4i) > x[[1]][1] 1[[2]] [1] "a"[[3]][1] TRUE[[4]][1] 1+4i
这里,我们可以看到这个列表包含四个对象,分别为数值型、字符型、逻辑型和复数型。
对于列表, 访问不同的元素( 可以是任何类型的对象)可以直接使用”列表名$变量名”来调用数据,也可以通过单一的方括号(“[]”)或者双重的方括号(”[[]]”)来实现;它们的区别在于: 单个括号返回一个列表, 而双重括号将提取列表中的对象:
> x <- list(foo = 1:4, bar = 0.6)> x$bar [1] 0.6> x["bar"] # 返回名称与值,是一个列表$bar[1] 0.6> x[["bar"]] # 返回元素的值[1] 0.6> x[1]$foo[1] 1 2 3 4> x[[1]][1] 1 2 3 4
如果想从列表中提取多个元素,需要使用单一括号”[]”:
> x <- list(foo = 1:4, bar = 0.6, baz = "hello")> x[c(1, 3)]$foo[1] 1 2 3 4$baz[1] "hello"
通过”$”访问对象的名称,可以允许名称局部匹配;”[[]]”访问对象,默认元素名称全局匹配,但将属性exact设置为TRUE时可局部匹配元素名称:
> x <- list(aardvark = 1:5)> x$a # 默认会从列表中寻找与字母a相匹配的名称[1] 1 2 3 4 5> x[["a"]]NULL> x[["a", exact = FALSE]] [1] 1 2 3 4 5
数据框(Data frame)用来存储表格数据,实际上就是一种特殊类型的列表,可看作是列表集合,列与列之间可以储存不同的数据类型,比如第一列是数值型,第二列可以是因子,但是同一列必须是同一种数据结构。同时数据框中的向量必须有相同的长度, 如果其中有一个比其它的短, 它将“循环” 整数次,以使得其长度与其它向量相同。
可通过函数data.frame()来创建;也可以由函数read.table()或read.csv()来间接创建:
> x <- 1:4; n <- 10; M <- c(10, 35); y <- 2:4> data.frame(x, n) x n1 1 102 2 103 3 104 4 10> data.frame(x, M) x M1 1 102 2 353 3 104 4 35> data.frame(x, y)Error in data.frame(x, y) : 参数值意味着不同的行数: 4, 3
可以使用属性row.names()来查看或修改行变量名,但是需注意这个命名向量必须是字符型的而且长度等于这个数据框的行数:
> x <- data.frame(foo = 1:4, bar = c(T, T, F, F)) > x foo bar1 1 TRUE2 2 TRUE3 3 FALSE4 4 FALSE> row.names(x)[1] "1" "2" "3" "4"> row.names(x)<-c("a", "b", "c" ,"d")> x foo bara 1 TRUEb 2 TRUEc 3 FALSEd 4 FALSE
提取数据框的子集,可以使用”[]”或”[[]]”,与矩阵和列表的方式相同,就不再累述;对于数据框中的列,也可直接使用“数据框名$变量名”,这种格式指向对应的列:
x <- data.frame(foo = 1:4, bar = c(T, T, F, F)) > x$bar[1] TRUE TRUE FALSE FALSE
联系客服