zoukankan      html  css  js  c++  java
  • 子集选取的一些函数

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

      

  • 相关阅读:
    (二)Linux进程调度器CPU负载 【转】 sky
    Tmux 使用教程【转】 sky
    Linux kernel中常见的宏整理【转】 sky
    linux内核内存slab,伙伴系统,内存碎片,内存耗尽(OOM)杀手,内存资源控制器memcg,KASAN学习笔记【转】 sky
    格式化log输出【转】 sky
    Linux虚拟化KVMQemu分析(十一)之virtqueue【转】 sky
    Linux内核内核数据类型【转】 sky
    Linux中断管理 (1)Linux中断管理机制【转】 sky
    Linux内存管理 (25)内存sysfs节点解读【转】 sky
    (一)Linux进程调度器基础【转】 sky
  • 原文地址:https://www.cnblogs.com/yuanzhoulvpi/p/8472780.html
Copyright © 2011-2022 走看看