专栏首页医学生物信息学R语言基础教程——第3章:数据结构综合运用

R语言基础教程——第3章:数据结构综合运用

数据结构综合运用

1

向量化运算符

在之前R语言基础教程——第3章:数据结构——向量中我们介绍过向量的加减乘除运算,在这里介绍一下>,<运算。

> x = c (88,5,12,13)
> y = c (98,3,14,9)
> z = c (90,12,34,45,5,3)
> x > y
[1] FALSE  TRUE FALSE  TRUE
> x < y 
[1]  TRUE FALSE  TRUE FALSE
> x > z
[1] FALSE FALSE FALSE FALSE  TRUE  TRUE
Warning message:
In x > z : 长的对象长度不是短的对象长度的整倍数
> b = c (99,3,15,6,14,56,45,12)
> x >= b
[1] FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE
>

如果2个向量长度相等,可以用<或>来判断向量中对应元素的大小关系,判断正确为TRUE,否则FALSE。如果长度不相等,也会判断,但会提示警告:长的对象长度不是短的对象长度的整倍数,如果是整数倍不会提示,需要注意。

在这里需要说明的是,x > y运算过程中,x[1]与y[1]运算得FALSE,x[2]与y[2]运算得TRUE,以此类推,得到的所有结果最后还是一个向量。关键在于一个函数使用了向量化的运算符,那么它也被向量化了。这对运算速度有很大的提升。

2

向量输入,矩阵输出

> vector = 1:20
> matrix1 = matrix(vector,ncol=4)
> vector
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
> matrix1
     [,1] [,2] [,3] [,4]
[1,]    1    6   11   16
[2,]    2    7   12   17
[3,]    3    8   13   18
[4,]    4    9   14   19
[5,]    5   10   15   20
>

3

NA和NULL值

在我们获取的实验数据中,有时候会有缺失值,也就是NA。

> age = c(23,34,NA,24,38,34,28,30)
> age
[1] 23 34 NA 24 38 34 28 30
> mean(age)
[1] NA
> mean(age,na.rm = T)
[1] 30.14286
> age2 = c(23,34,NULL,24,38,34,28,30)
> mean(age2)
[1] 30.14286
> 

如果数据中用NA值,那么在进行相应的运算时会出错,可通过na.rm = T(意思为移除NA)声明,计算其余的值,而对于NULL,R会自动跳过。

NA和NULL是有区别的,NA会被当成一个元素,NULL是当成不存在的。

> age = c(23,34,NA,24,38,34,28,30)
> age2 = c(23,34,NULL,24,38,34,28,30)
> length(age)
[1] 8
> length(age2)
[1] 7
> 

这在矩阵,数据框中的性质是一样的

> matrix1
     [,1] [,2] [,3] [,4]
[1,]    1    6   11   16
[2,]    2    7   12   17
[3,]    3    8   13   18
[4,]    4    9   14   19
[5,]    5   10   15   20
> matrix1[1,3] = NA
> matrix1
     [,1] [,2] [,3] [,4]
[1,]    1    6   NA   16
[2,]    2    7   12   17
[3,]    3    8   13   18
[4,]    4    9   14   19
[5,]    5   10   15   20
> mean(matrix1)
[1] NA
> data = as.data.frame(matrix1)#将矩阵转化为数据框
> data
  V1 V2 V3 V4
1  1  6 NA 16
2  2  7 12 17
3  3  8 13 18
4  4  9 14 19
5  5 10 15 20
> mean(data)
[1] NA
Warning message:
In mean.default(data) : 参数不是数值也不是逻辑值:回覆NA
> mean(data[4,4])
[1] 19
>

4

筛选

如果要要从大量数据中找出符合一定要求的数据,就得用到R中的筛选功能。

> a = c(1:10)
> w = a[a>5] #获取a中大于5的元素
> w
[1]  6  7  8  9 10
> 

我们对向量a使用了>符号,也发生了向量化。这与使用a[c(FALSE,FALSE,FALSE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE,TRUE)]是一样的结果。

> a>5
 [1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
> a[c(FALSE,FALSE,FALSE,FALSE,FALSE ,TRUE,TRUE,TRUE,TRUE,TRUE)]
[1]  6  7  8  9 10

除了上面这种方式以外,我们还可以通过函数获取。

> a
 [1]  1  2  3  4  5  6  7  8  9 10
> subset(a,a<5)
[1] 1 2 3 4
> 

subset()函数获取子集时会忽略NA值。而之前通过索引获取时NA值不会被忽略。

> aa = c(2,4,3,6,2,5,8,NA,9,2,4,4,5)
> aa*aa>10 # 
 [1] FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE    NA  TRUE FALSE  TRUE  TRUE
[13]  TRUE
> aa[aa*aa>10]
[1]  4  6  5  8 NA  9  4  4  5
> subset(aa,aa*aa>10)
[1] 4 6 5 8 9 4 4 5
>

这些是直接获取元素的值,倘若我们要获取元素的位置,可以使用which()函数。which()函数统一会忽略NA值。

> which(aa>5)
[1] 4 7 9
> 

注意在矩阵和数据框中的使用。

> matrix1
     [,1] [,2] [,3] [,4]
[1,]    1    6   NA   16
[2,]    2    7   12   17
[3,]    3    8   13   18
[4,]    4    9   14   19
[5,]    5   10   15   20
> subset(matrix1,matrix1 > 3) #subset函数不能直接用于矩阵
Error in x[subset & !is.na(subset), vars, drop = drop] : 
  (下标)逻辑下标太长
> subset(matrix1[,1],matrix1[,1]>3) #指定特定的行或列可以用subset
[1] 4 5
> data
  V1 V2 V3 V4
1  1  6 NA 16
2  2  7 12 17
3  3  8 13 18
4  4  9 14 19
5  5 10 15 20
> data>3
        V1   V2   V3   V4
[1,] FALSE TRUE   NA TRUE
[2,] FALSE TRUE TRUE TRUE
[3,] FALSE TRUE TRUE TRUE
[4,]  TRUE TRUE TRUE TRUE
[5,]  TRUE TRUE TRUE TRUE
> data[ data>3]
 [1]  4  5  6  7  8  9 10 NA 12 13 14 15 16 17 18 19 20
> which(matrix1>4)
 [1]  5  6  7  8  9 10 12 13 14 15 16 17 18 19 20
> which(data > 5)
 [1]  6  7  8  9 10 12 13 14 15 16 17 18 19 20
> 

5

apply()函数的运用

apply(matrix,dimcode = 1,f,fargs)。matrix是一个矩阵,dimcode = 1表示按行运用函数,=2表示按列运用函数。

> matrix1
     [,1] [,2] [,3] [,4]
[1,]    1    6   NA   16
[2,]    2    7   12   17
[3,]    3    8   13   18
[4,]    4    9   14   19
[5,]    5   10   15   20
> apply(matrix1,2,mean) #按列求均值
[1]  3  8 NA 18
> f = function(x) x/2 #定义一个函数
> y = apply(matrix1,1,f)
> y
     [,1] [,2] [,3] [,4] [,5]
[1,]  0.5  1.0  1.5  2.0  2.5
[2,]  3.0  3.5  4.0  4.5  5.0
[3,]   NA  6.0  6.5  7.0  7.5
[4,]  8.0  8.5  9.0  9.5 10.0
>

matrix1是一个5行4列是矩阵,运用f函数以后发现变成了一个4行5列的矩阵,这是apply函数的默认方式,可用转置函数t()进行转换。

> t(y)
     [,1] [,2] [,3] [,4]
[1,]  0.5  3.0   NA  8.0
[2,]  1.0  3.5  6.0  8.5
[3,]  1.5  4.0  6.5  9.0
[4,]  2.0  4.5  7.0  9.5
[5,]  2.5  5.0  7.5 10.0
>

apply函数用于矩阵,lapply()和sapply()用于列表,lapply()返回一个列表,sapply()返回一个向量。

> lapply(list(1:3,25:29),median)
[[1]]
[1] 2

[[2]]
[1] 27

> sapply(list(1:3,25:29),median)
[1]  2 27

6

数据的合并

rbind()和cbind()函数可用于合并数据框或者矩阵的数据。合并数据要求数据具有相同的行或者列。

> m = matrix(1:8,nrow = 4)
> m
     [,1] [,2]
[1,]    1    5
[2,]    2    6
[3,]    3    7
[4,]    4    8
> mf =  data.frame(a= 1:5,b = 6:10)
> mf
  a  b
1 1  6
2 2  7
3 3  8
4 4  9
5 5 10
>  cbind(m,9:12) 
     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    6   10
[3,]    3    7   11
[4,]    4    8   12
> cbind(mf,c = 11:15)
  a  b  c
1 1  6 11
2 2  7 12
3 3  8 13
4 4  9 14
5 5 10 15
> rbind(m,1:2)
     [,1] [,2]
[1,]    1    5
[2,]    2    6
[3,]    3    7
[4,]    4    8
[5,]    1    2
> rbind(mf,c(66,67))
   a  b
1  1  6
2  2  7
3  3  8
4  4  9
5  5 10
6 66 67
> 

7

tapply()函数

> ages = c(25,26,55,37,31,42)
> affils = c("R","D","D","R","U","D")
> tapply(ages,affils,mean)
 D  R  U 
41 31 31 
> 

函数tapply()把向量c("R","D","D","R","U","D")作为具有水平"D","R","U"的因子。

8

split()函数

> g = c("M","F","F","I","M","M","F")
> split(1:7,g)
$F
[1] 2 3 7

$I
[1] 4

$M
[1] 1 5 6

向量g作为因子有三个水平M,F,I,对应到第一水平的索引值为1,5,6,意味着g[1]、g[5]和g[6]具有值"M"。因此输出结果中组件M为向量1:7中的第1,5,6位元素,即c(1,5,6)。

9

by()函数

by(data, INDICES, FUN, ..., simplify = TRUE)

data通常是一个数据库,也可以是一矩阵。INDICES是一个因子或一组因子,每个因子的长度为nrow(数据)。 FUN是要应用于(通常是数据框)data子集的函数。

require(stats)
by(warpbreaks[, 1:2], warpbreaks[,"tension"], summary)
by(warpbreaks[, 1],   warpbreaks[, -1],summary)
by(warpbreaks, warpbreaks[,"tension"],
   function(x) lm(breaks ~ wool, data = x))

## now suppose we want to extract the coefficients by group
tmp <- with(warpbreaks,
            by(warpbreaks, tension,
               function(x) lm(breaks ~ wool, data = x)))
sapply(tmp, coef)

aggregate()与cut()函数自学。

本文分享自微信公众号 - MedBioInfoCloud(MedBioInfoCloud),作者:DoubleHelix

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • R语言基础教程——第8章:文件的输入与输出

    做生物信息分析,少不了的就是数据,比如转录组的数据,无论是下载的还是测序的,用R进行分析,就必须将这些数据读入,分析的结果,比如一些图,就少不了输出,因此,文件...

    DoubleHelix
  • CentOS 7系统服务器上安装R和Rstudio,并在浏览器中运行Rstudio

    如果你已经购买服务器,登陆这里就不多说了,这里用的是腾讯云服务器CentOS 7系统

    DoubleHelix
  • 基因芯片数据分析(六):DESeq2包的基本原理

    DESeq2是另外一个分析差异基因的R包,它的功能很多,使用也比较复杂。我们在前面提到过,RPKM,FPKM与TPM是常用的用于均一化不同的样本reads数的方...

    DoubleHelix
  • [linux][network]ICMP协议分析

    前言: ICMP比较基础,说简单不简单,说难不难。 简单在于字段少,不能携带用户数据,没什么地方可以玩出太多花样;一般和它相关的就是ping和tracerout...

    皮振伟
  • Java语法糖(二)

      内部类:顾名思义,在类的内部在定义一个类。内部类仅仅是编译时的概念,编译成字节码后,内部类会生成单独的Class文件。

    在周末
  • Bi-level error correction for PacBio long reads 双级错误校正PacBio长read

    最新的测序技术,如太平洋生物科学公司(PacBio)和牛津纳米孔机器可以产生数千个碱基长度的长读,这比Illumina机器产生的数百个碱基长度的长得多。

    wangprince2017
  • Parrot 4.5 发布:基于 Debian 的 Linux 发行版

    Parrot 是一个基于 Debian 的 GNU/Linux 发行版,其设计上主要考虑安全性和隐私性。

    Debian社区
  • 替换Debug Probes其实很简单

    在使用Vivado Logic Analyzer调试时,常会遇到这样的情形:当前阶段需要观测信号xa_reg,下一阶段需要观测xb_reg,两个阶段原始设计并没...

    Lauren的FPGA
  • Git 项目推荐 | Java 版按键精灵

    快速开发工具类,用最简洁的命令实现想要的功能。辅助模拟开发。 纯Java,跨平台,模拟按键、鼠标点击、找图、找色,实现简单按键精灵的功能 DEMO演示 ! ...

    码云Gitee
  • flowchart.js徒手绘制流程图

    要画20个流程(时序)图,于是昨天捣鼓了到半夜,安装了plantUML + vscode,虽然丑了些,但勉强能看,目前已用plantUML完成了10个。...

    周星星9527

扫码关注云+社区

领取腾讯云代金券