> #chapter 3 > #原子向量 > x <- c(2.1,4.2,3.3,5.4) > #正数返回指定位置上的元素 > x[c(1,1,2,2)] [1] 2.1 2.1 4.2 4.2 > #c()内的数尽管是小数,但是返回整数 > x[c(1.2,1.2,2.6,2.3)] [1] 2.1 2.1 4.2 4.2 > #负数意为不包含这个位置上的数 > x[-2] [1] 2.1 3.3 5.4 > #在同一子集选取过程中,不能同时使用正整数和负整数 > x[c(-1,2)] Error in x[c(-1, 2)] : only 0's may be mixed with negative subscripts > #对于逻辑向量,只对应于逻辑向量为TRUE的元素 > x[c(TRUE,FALSE,TRUE,FALSE)] [1] 2.1 3.3 > #如果逻辑向量要比从中选取的子集的向量短,那么逻辑向量就会循环使用 > x[c(TRUE,FALSE)] [1] 2.1 3.3 > #空索引是返回原始向量 > x[] [1] 2.1 4.2 3.3 5.4 > #字符向量返回与索引中的名字相匹配的元素 > (y <- setNames(x,letters[1:4])) a b c d 2.1 4.2 3.3 5.4 > y[c('a','b','c')] a b c 2.1 4.2 3.3 > > #对矩阵和数组一些经典的提取方法 > a <- matrix(1:9,nrow = 3) > colnames(a) <- c('A','B','C') > a A B C [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 > a[1:2,] A B C [1,] 1 4 7 [2,] 2 5 8 > a[c(TRUE,FALSE,TRUE),c('B','A')] B A [1,] 4 1 [2,] 6 3 > #由于矩阵和数组具有特殊的形式,所以可以使用一个单一的向量来对他们进行子集选取 > (vals <- outer(1:5,1:5,FUN = 'paste',sep = ',')) [,1] [,2] [,3] [,4] [,5] [1,] "1,1" "1,2" "1,3" "1,4" "1,5" [2,] "2,1" "2,2" "2,3" "2,4" "2,5" [3,] "3,1" "3,2" "3,3" "3,4" "3,5" [4,] "4,1" "4,2" "4,3" "4,4" "4,5" [5,] "5,1" "5,2" "5,3" "5,4" "5,5" > vals[c(4,16,20)] [1] "4,1" "1,4" "5,4" > #也可以使用矩阵提取矩阵 > (select <- matrix(ncol = 2,byrow = TRUE,c( + 1,1, + 3,1, + 2,4 + ))) [,1] [,2] [1,] 1 1 [2,] 3 1 [3,] 2 4 > vals[select] [1] "1,1" "3,1" "2,4" > > #数据框经典操作 > (df <- data.frame(x = 1:3,y = 3:1,z = letters[1:3])) x y z 1 1 3 a 2 2 2 b 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 > 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 > > #简化与保留 > #原子向量:去除名字 > x <- c(a = 1,b = 2) > x[1] a 1 > x[[1]] [1] 1 > #列表:返回列表中的对象,而不是一个元素列表 > y <- list(a = 1,b = 2) > str(y[1]) List of 1 $ a: num 1 > str(y[[1]]) num 1 > #因子:扔掉所有不用的水平 > z <- factor(c('a','b')) > z[1] [1] a Levels: a b > z[1,drop = TRUE] [1] a Levels: a > #矩阵或者数组:抛掉所有长度为1的维度 > a <- matrix(1:4,ncol = 2) > a[1,,drop = FALSE] [,1] [,2] [1,] 1 3 > a[1,] [1] 1 3 > #数据框;如果输出只有一列,返回一个向量而不是数据框 > df <- data.frame(a = 1:2,b = 1:2) > str(df[1]) 'data.frame': 2 obs. of 1 variable: $ a: int 1 2 > str(df[[1]]) int [1:2] 1 2 > str(df[,'a',drop = FALSE]) 'data.frame': 2 obs. of 1 variable: $ a: int 1 2 > str(df[,'a']) int [1:2] 1 2 > > #¥是一个简写的运算符,x$y 相当于x[['y',exact = FALSE]]。经常用来访问数据框中的变量 > #使用$最常见的错误如下(要直接引用列的名字,不然就是错误的): > var <- 'cyl' > mtcars$var NULL > mtcars$cyl [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 [32] 4 > > #$和[[之间有个很重要的不同,就是$是部分匹配: > x <- list(abc = 1) > x$a [1] 1 > x[['a']] NULL > > #查询表 > #字符匹配为创造查询表提供一个强大的方法 > #比如,你先将简写转换成全拼: > x <- c('m','f','u','f','f','m','m') > lookup <- c(m = 'Male',f = 'Female',u = NA) > lookup[x] m f u f f m m "Male" "Female" NA "Female" "Female" "Male" "Male" > unname(lookup[x]) [1] "Male" "Female" NA "Female" "Female" "Male" "Male" > #随机样本/自助法 > df <- data.frame(x = rep(1:3,each = 2),y = 6:1,z = letters[1:6]) > #随意排序 > df[sample(nrow(df)),] x y z 5 3 2 e 4 2 3 d 1 1 6 a 6 3 1 f 3 2 4 c 2 1 5 b > #从中任选3个 > df[sample(nrow(df),3),] x y z 4 2 3 d 3 2 4 c 2 1 5 b > #从中选取6个,有放回 > df[sample(nrow(df),6,replace = TRUE),] x y z 6 3 1 f 3 2 4 c 6.1 3 1 f 1 1 6 a 3.1 2 4 c 2 1 5 b > #排序 > df2 <- df[sample(nrow(df)),3:1] > df2 z y x 1 a 6 1 2 b 5 1 5 e 2 3 6 f 1 3 4 d 3 2 3 c 4 2 > df2[order(df2$x),] z y x 1 a 6 1 2 b 5 1 4 d 3 2 3 c 4 2 5 e 2 3 6 f 1 3 > df2[,order(names(df2))] x y z 1 1 6 a 2 1 5 b 5 3 2 e 6 3 1 f 4 2 3 d 3 2 4 c > #一般来说,表达式越简单,灵活性越低。当为了从升序变成降序,可以添加decreasing = TRUE. > #一般缺失值会放在最后,如果去除缺失值,可以使用na.last = NA。也可以用na.last = FALSE将缺失值放在开头。 > > #展开重复记录 > df <- data.frame(x = c(2,4,1),y = c(9,11,6),n = c(3,5,1)) > rep(1:ncol(df),df$n) [1] 1 1 1 2 2 2 2 2 3 > df[rep(1:nrow(df),df$n),] x y n 1 2 9 3 1.1 2 9 3 1.2 2 9 3 2 4 11 5 2.1 4 11 5 2.2 4 11 5 2.3 4 11 5 2.4 4 11 5 3 1 6 1 > > #剔除数据框中的列 > #第一种可以将这些列设置为NULL > df <- data.frame(x = 1:3,y = 3:1,z = letters[1:3]) > df$z <- NULL > df x y 1 1 3 2 2 2 3 3 1 > #第二种就是直接提取需要的列 > > #根据条件选取子集: > mtcars[mtcars$gear == 5,] mpg cyl disp hp drat wt qsec vs am gear carb Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.7 0 1 5 2 Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.9 1 1 5 2 Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.5 0 1 5 4 Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.5 0 1 5 6 Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.6 0 1 5 8 > #也可以使用subset()和布尔运算结合: > subset(mtcars,gear == 5) mpg cyl disp hp drat wt qsec vs am gear carb Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.7 0 1 5 2 Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.9 1 1 5 2 Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.5 0 1 5 4 Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.5 0 1 5 6 Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.6 0 1 5 8 > subset(mtcars,gear == 5 & cyl == 4) mpg cyl disp hp drat wt qsec vs am gear carb Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.7 0 1 5 2 Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.9 1 1 5 2 > > #也可以使用which()函数 > which(LETTERS == "R") [1] 18 > which(ll <- c(TRUE, FALSE, TRUE, NA, FALSE, FALSE, TRUE)) [1] 1 3 7 > names(ll) <- letters[seq(ll)] > which(ll) a c g 1 3 7 > which((1:12)%%2 == 0) [1] 2 4 6 8 10 12 > which(1:10 > 3, arr.ind = TRUE) [1] 4 5 6 7 8 9 10