美文网首页统计分析方法RR data manipulate
R for Data Science(笔记) ---数据变换(s

R for Data Science(笔记) ---数据变换(s

作者: 生信小鹏 | 来源:发表于2021-07-03 17:38 被阅读0次
    R for Data Science

    紧接之前写的select的基础操作

    4. 拓展2

    其实select的使用,和其他函数结合搭配使用会发挥强大的作用

    结合函数 last_col()

    选取倒数第几列,默认是最后一列是0

    先看一看iris这个数据集的样子

    head(iris)
      Sepal.Length Sepal.Width Petal.Length Petal.Width Species
    1          5.1         3.5          1.4         0.2  setosa
    2          4.9         3.0          1.4         0.2  setosa
    3          4.7         3.2          1.3         0.2  setosa
    4          4.6         3.1          1.5         0.2  setosa
    5          5.0         3.6          1.4         0.2  setosa
    6          5.4         3.9          1.7         0.4  setosa
    

    总共有5列

    iris %>% select(last_col())
    #> # A tibble: 150 x 1
    #>   Species
    #>   <fct>  
    #> 1 setosa 
    #> 2 setosa 
    #> 3 setosa 
    #> 4 setosa 
    #> # ... with 146 more rows
    

    可以看到,没有任何参数情况下,其选择的是最后一列。

    > iris %>% select(3:last_col(1)) %>% head()
      Petal.Length Petal.Width
    1          1.4         0.2
    2          1.4         0.2
    3          1.3         0.2
    4          1.5         0.2
    5          1.4         0.2
    6          1.7         0.4
    

    select(3:last_col(1))这个参数就是选取第三列到倒数第二列的数据,同样可以推广到选取倒数第二列到倒数第4列,方法同上。

    结合函数 everything() 函数

    我一般习惯结合使用everything函数进行一个列的重新排列。

    例如,我想把一个数据框的第3,6,8,列放在最前面,这样方便我查看,其余的顺序不变。
    以原来flights数据为例,可以这样书写

    select(flights, time_hour, air_time, everything())
    #> # A tibble: 336,776 x 19
    #>   time_hour           air_time  year month   day dep_time sched_dep_time
    #>   <dttm>                 <dbl> <int> <int> <int>    <int>          <int>
    #> 1 2013-01-01 05:00:00      227  2013     1     1      517            515
    #> 2 2013-01-01 05:00:00      227  2013     1     1      533            529
    #> 3 2013-01-01 05:00:00      160  2013     1     1      542            540
    #> 4 2013-01-01 05:00:00      183  2013     1     1      544            545
    #> 5 2013-01-01 06:00:00      116  2013     1     1      554            600
    #> 6 2013-01-01 05:00:00      150  2013     1     1      554            558
    #> # … with 336,770 more rows, and 12 more variables: dep_delay <dbl>,
    #> #   arr_time <int>, sched_arr_time <int>, arr_delay <dbl>, carrier <chr>,
    #> #   flight <int>, tailnum <chr>, origin <chr>, dest <chr>, distance <dbl>,
    #> #   hour <dbl>, minute <dbl>
    

    与starts_with()函数结合

    iris %>% select(starts_with("Sepal"))
    #> # A tibble: 150 x 2
    #>   Sepal.Length Sepal.Width
    #>          <dbl>       <dbl>
    #> 1          5.1         3.5
    #> 2          4.9         3  
    #> 3          4.7         3.2
    #> 4          4.6         3.1
    #> # ... with 146 more rows
    

    与ends_with()函数结合

    iris %>% select(ends_with("Width"))
    #> # A tibble: 150 x 2
    #>   Sepal.Width Petal.Width
    #>         <dbl>       <dbl>
    #> 1         3.5         0.2
    #> 2         3           0.2
    #> 3         3.2         0.2
    #> 4         3.1         0.2
    #> # ... with 146 more rows
    

    使用这两个函数的一点tips:这两个函数当中的内容必须是字符串形式,也就是要加上引号,如果不加上引号,不能执行。这里我放上我自己的数据的一个例子。

    数据是行名是TCGA的编码,总共15位,就是这个样子。



    目的是只挑选出14,15位是小于11的数据。

    #正确的输入方式
    RCC_test <- expr_RCC %>% select(ends_with(c("01","05")))
    
    #错误的输入方式
    RCC_test <- expr_RCC %>% select(ends_with(c(01,05)))
    

    当然,最开始的时候,我是用的是基础R

    RCC_cancer <- expr_RCC[,str_sub(colnames(expr_RCC),14,15) < 11]
    

    两者好像都还算简洁。

    与contains()函数结合

    这个有点类似通配符或者正则表达式

    iris %>% select(contains("al"))
    #> # A tibble: 150 x 4
    #>   Sepal.Length Sepal.Width Petal.Length Petal.Width
    #>          <dbl>       <dbl>        <dbl>       <dbl>
    #> 1          5.1         3.5          1.4         0.2
    #> 2          4.9         3            1.4         0.2
    #> 3          4.7         3.2          1.3         0.2
    #> 4          4.6         3.1          1.5         0.2
    #> # ... with 146 more rows
    

    与 matches()函数结合

    这个就是用到了正则表达式的

    iris %>% select(matches("[pt]al")) 
    #> # A tibble: 150 x 4
    #>   Sepal.Length Sepal.Width Petal.Length Petal.Width
    #>          <dbl>       <dbl>        <dbl>       <dbl>
    #> 1          5.1         3.5          1.4         0.2
    #> 2          4.9         3            1.4         0.2
    #> 3          4.7         3.2          1.3         0.2
    #> 4          4.6         3.1          1.5         0.2
    #> # ... with 146 more rows
    

    结合where()函数

    where()里面可以是函数,这个就厉害了,可以给与判断语句

    iris %>% select(where(is.factor))
    #> # A tibble: 150 x 1
    #>   Species
    #>   <fct>  
    #> 1 setosa 
    #> 2 setosa 
    #> 3 setosa 
    #> 4 setosa 
    #> # ... with 146 more rows
    

    结合which()函数

    既然能用where(), which()也是可以的

    这个是我自己找到的方法,同样利用刚才自己的数据

    RCC_test <- expr_RCC %>% select(which(str_sub(colnames(expr_RCC),14,15) < 11))
    

    结果同样,nice

    相关文章

      网友评论

        本文标题:R for Data Science(笔记) ---数据变换(s

        本文链接:https://www.haomeiwen.com/subject/fbkyultx.html