子集选取的一些函数

> #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

  

posted on 2018-02-26 13:45  yuanzhoulvpi  阅读(601)  评论(0编辑  收藏  举报

导航