统计分析方法RR data manipulate

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

2021-07-03  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读