专栏名称: 生信百科
依托高校科研平台,面向生物信息科研工作者。生物信息学习资料;常见数据分析技巧、流程;公共数据库分享;科研思路分享;
目录
相关文章推荐
l 看齐 l  ·  最新研究!这一病毒可能趋向流感化 ·  昨天  
l 看齐 l  ·  最新研究!这一病毒可能趋向流感化 ·  昨天  
学术经纬  ·  春节期间,你可能错过的10项重磅研究! ·  昨天  
医学影像沙龙  ·  心血管磁共振的CMR解读及诊断思路 ·  昨天  
51好读  ›  专栏  ›  生信百科

R基础笔记

生信百科  · 公众号  · 医学  · 2017-10-09 07:00

正文


R 语言数据操作基础

1. 数据类型

R 里的数据类型有数值型(numeric),复数型(complex),字符型(character)以及逻辑型(logical)。还有两种特殊的数据:数据的缺失(NA)和数据的未知状态(NULL)。

x 1, 2, 3, 4, NA)

x

[1]  1  2  3  4 NA

mean(NA) # 在计算时,NA 不会被直接剔除

[1] NA

length(x)

[1] 5

mean(x, na.rm = T) # 去除 NA 的影响

[1] 2.5

mean(na.omit(x), na.rm = T) # 另外一种方法

[1] 2.5

# NULL 则跟 NA 不一样

y 1, 2, 3, 4, NULL)

mean(y)

[1] 2.5

length(y)

[1] 4

###

# is.na 判断数据中是否含有 NA

is.na(x)

[1] FALSE FALSE FALSE FALSE  TRUE

is.na(y)

[1] FALSE FALSE FALSE FALSE

# is.null 判断整个数据是否为 NULL

is.null(x)

[1] FALSE

is.null(y)

[1] FALSE

2. 对象及其属性

对象是 R 语言的基础性概念,R 语言内的数据变量、函数结果、产生的图像等,都是以对象的形似存在的。R 语言的对象类型有向量(vector)、数组(array)、矩阵(matrix)、列表(list)和数据框(data frame)等。列表和数据框可以包含不同的数据类型。

对象的长度可以是 0,可以通过对象的下标赋值。如果需要赋值的下标超过了原有对象的长度,中间会被 NA 填充。

a

a

numeric(0)

a[1] 2

a[4] 5

a

[1]  2 NA NA  5

查看对象属性

x 11:16), name2 = c(17:22)) # 创建一个数据框

x

name1 name2

1    11    17

2    12    18

3    13    19

4    14    20

5    15    21

6    16    22

attributes(x) # 查看属性

$names

[1] "name1" "name2"

$row.names

[1] 1 2 3 4 5 6

$class

[1] "data.frame"

# 单独来看

names(x) # 列名称属性

[1] "name1" "name2"

row.names(x)

[1] "1" "2" "3" "4" "5" "6"

class(x)

[1] "data.frame"

#

attr(x, "name")

[1] "name1" "name2"

attr(x, "name")[1]

[1] "name1"

attr(x, "name")[2]

[1] "name2"

#

nrow(x) # 行数

[1] 6

ncol(x) # 列数

[1] 2

3. 向量

3.1 向量索引

a 11:20)

a

[1] 11 12 13 14 15 16 17 18 19 20

# (1) 下标索取

a[1]

[1] 11

a[c(1:3)]

[1] 11 12 13

# (2) which 索取

which(a == c(11,16))

[1] 1 6

a[which(a == c(11,16))]

[1] 11 16

a[which(a 12 & a < 17)]

[1] 13 14 15 16

# (3) subset 索取

subset(a, a 12 & a < 17)

[1] 13 14 15 16

# (4) match 索取

# match(x, table, nomatch = NA_integer_, incomparables = NULL)

# table 为匹配的数值,可以是向量形式;nomatch 为设置不匹配时返回的值,默认为 NA;

# incomparables 为设置 table 中的无效值,默认为 NULL

a 20:11)

match(c(11:15),a)

[1] 10  9  8  7  6

# (5) %in% 索引

# 判定对象是否在包含某项数据

c(11,31) %in% a

[1]  TRUE FALSE

3.2 向量编辑

#

a[2] 21

a

[1 ] 11 21 13 14 15 16 17 18 19 20

#

a 31:33))

a

[1] 11 21 13 14 15 16 17 18 19 20 31 32 33

#

a 1:3)]

a

[1] 14 15 16 17 18 19 20 31 32 33

3.3 向量排序

x 1, 2, 5, 9, 4, 6, 3)

x

[1] 1 2 5 9 4 6 3

# 按下标倒序

rev(x)

[1] 3 6 4 9 5 2 1

# 按数值从小到大排序

sort(x)

[1] 1 2 3 4 5 6 9

# 按数值从大到小排序

sort(x, decreasing = TRUE)

[1] 9 6 5 4 3 2 1

rev(sort(x))

[1] 9 6 5 4 3 2 1

3.4 向量去重

x 1, 2, 5, 9, 4, 6, 3, 2, 2)

x

[1] 1 2 5 9 4 6 3 2 2

unique(x)

[1] 1 2 5 9 4 6 3

#

table(x)

x

1 2 3 4 5 6 9

1 3 1 1 1 1 1

names(table(x))

[1] "1" "2" "3" "4" "5" "6" "9"

as.numeric(names(table(x)))

[1] 1 2 3 4 5 6 9

3.5 缺失值

b 1,2,3,NA,5)

b

[1]  1  2  3 NA  5

b[!is.na(b)]

[1] 1 2 3 5

d 1,2,3,NA,5),name2 = (6:10))

d

name1 name2

1     1     6

2     2     7

3     3     8

4    NA     9

5     5    10

na.omit(d)

name1 name2

1     1     6

2     2     7

3     3     8

5     5    10

3.6 向量间操作

# 比较大小

a 1,4,5,6,3)

b 2,6,4,8,7)

c 0,4,1,2,6)

# (1) 取相同索引下最小值

pmin(a,b,c)

[1] 0 4 1 2 3

# (2) 取相同索引大最小值

pmax(a,b,c)

[1] 2 6 5 8 7

# 交集、并集、补集

#  union(x, y)

#  intersect(x, y)

#  setdiff(x, y)

#  setequal(x, y)

a 1,4,5,6,3)

b 2,6,4,8,7)

# (1) 交集

intersect(a,b)

[1] 4 6

# (2) 并集

union(a,b)

[1 ] 1 4 5 6 3 2 8 7

# (3) 补集

setdiff(a,b)

[1] 1 5 3

4. 矩阵

4.1 创建矩阵

data 1:10)

data

[1]  1  2  3  4  5  6  7  8  9 10

a 2, nrow = 5)

a

[,1] [,2]

[1,]    1    6

[2,]    2    7

[3,]    3    8

[4,]    4    9

[5,]    5   10

dim(a) # 矩阵 a 的维数向量

[1] 5 2

a 2, nrow = 5, byrow = T)

a

[,1] [,2]

[1,]    1    2

[2,]    3    4

[3,]    5    6

[4,]    7    8

[5,]    9   10

##

data

[1]  1  2  3  4  5  6  7  8  9 10

a

a

[,1]

[1,]    1

[2,]    2

[3,]    3

[4,]    4

[5,]    5

[6,]    6

[7,]    7

[8,]    8

[9,]    9

[10,]   10

dim(a) 2, 5)

a

[,1] [,2] [,3] [,4] [,5]

[1,]    1    3    5    7    9

[2,]    2    4    6    8   10

#

dimnames(a)

NULL

a 2, nrow = 5, dimnames = list(c("r1", "r2", "r3", "r4", "r5"), c("c1", "c2")))

# list 中,行名称在前

a

c1 c2

r1  1  6

r2  2  7

r3  3  8

r4  4  9

r5  5 10

# 矩阵转为向量

as.vector(a)

[1]  1  2  3  4  5  6  7  8  9 10

4.2 矩阵索引

a

c1 c2

r1  1  6

r2  2  7

r3  3  8

r4  4  9

r5  5 10

# (1) 行列下标索引

a[3, 2] # 第三行,第二列

[1] 8

a[3,] # 第三行, 所有的列

c1 c2

3  8

# (2) 行和列的名称索引

a["r3", "c2"]

[1] 8

# (3) 一维下标索引

a[[8]] # as.vector(a) 中的第八个,即第三行第二列,

[1] 8

a[, 2] # 所有行的第二列

r1 r2 r3 r4 r5

6  7  8  9 10

a[,"c2"]

r1 r2 r3 r4 r5

6  7  8  9 10

a["r3",]

c1 c2

3  8

4.3 矩阵编辑

4.3.1 合并

dat1 1:6)

a1 3, 2)

a1

[,1] [,2]

[1,]    1    4

[2,]    2    5

[3,]    3    6

rbind(a1, c(7,8))

[,1] [,2]

[1,]    1    4

[2,]    2    5

[3,]    3    6

[4,]    7    8

a2 7:10), 2, 2)

a2

[,1] [,2]

[1,]    7    9

[2,]    8   10

a2 7:10), 2, 2 )

rbind(a1, a2)

[,1] [,2]

[1,]    1    4

[2,]    2    5

[3,]    3    6

[4,]    7    9

[5,]    8   10

4.3.2 删除

a 2, 5)

a

[,1] [,2] [,3] [,4] [,5]

[1,]    1    3    5    7    9

[2,]    2    4    6    8   10

a[, -1]

[,1] [,2] [,3] [,4]

[1,]    3    5    7    9

[2,]    4    6    8   10

a[-1,]

[1]  2  4  6  8 10

a[, -c(2,4)] # 删除第二列和第四列

[,1] [,2] [,3]

[1,]    1    5    9

[2,]    2    6   10

4.4 矩阵运算

A 1:12), 4, 3)

A

[,1] [,2] [,3]

[1,]    1    5    9

[2,]    2    6   10

[3,]    3    7   11

[4,]    4    8   12

B 4:15), 4, 3, byrow = T)

B

[,1] [,2] [,3]

[1,]    4    5    6

[2,]    7    8    9

[3,]   10   11   12

[4,]   13   14   15

C 12:1), 3, 4)

C

[,1] [,2] [,3] [,4]

[1,]   12    9    6    3

[2,]   11    8    5    2

[3,]   10    7    4    1

set.seed(2017-03-25)

D 16), 4, 4) # 服从正态分布

D

[,1]       [,2]       [,3]       [,4]

[1,]  1.102578 -0.6131956  0.1425635 -0.2969721

[2,]  1.117896 -0.3462673 -0.6942374  1.9589066

[3,] -1.818102  0.2779588  1.3619621 -2.4309599

[4,] -0.194414  0.5345426  1.2761510  0.4797144

########

# 1. 一般运算

# 1.1 矩阵加法

A + B

[,1] [,2] [,3]

[1,]    5   10   15

[2,]    9   14   19

[3,]   13   18   23

[4,]   17   22   27

A + 1

[,1] [,2] [,3]

[1,]    2    6   10

[2,]    3    7   11

[3,]    4    8   12

[4,]    5    9   13

# 1.2 矩阵减法

A - B

[,1] [,2] [,3]

[1,]   -3    0    3

[2,]   -5   -2    1

[3,]   -7   -4   -1

[4,]   -9   -6   -3

# 1.3 矩阵各个对应的元素相乘

A * B # 对应的元素相乘。这跟线性代数的不同

[,1] [,2] [,3]

[1,]    4   25   54

[2,]   14   48   90

[3,]   30   77  132

[4,]   52  112  180

# 1.3 矩阵乘法

A %*% C # 真正的矩阵相乘

[,1] [,2 ] [,3] [,4]

[1,]  157  112   67   22

[2,]  190  136   82   28

[3,]  223  160   97   34

[4,]  256  184  112   40

# 2. 转置

A

[,1] [,2] [,3]

[1,]    1    5    9

[2,]    2    6   10

[3,]    3    7   11

[4,]    4    8   12

t(A)

[,1] [,2] [,3] [,4]

[1,]    1    2    3    4

[2,]    5    6    7    8

[3,]    9   10   11   12

# 3. 矩阵求解

solve(D, A) # 对 DX = A 求解

[,1]       [,2]      [,3]

[1,] -3.773014  -9.498001 -15.22299

[2,] -8.886507 -26.314422 -43.74234

[3,]  5.011581  12.710546  20.40951

[4,]  3.379416   8.336332  13.29325

# 4. 矩阵的特征值和特征向量

eigen(D)

$values

[1]  0.816276+1.747713i  0.816276-1.747713i  1.337370+0.000000i

[4] -0.371935+0.000000i

$vectors

[,1]                  [,2]           [,3]

[1,] -0.0732813+0.2308877i -0.0732813-0.2308877i  0.76894475+0i

[2,]  0.4790390+0.1347590i  0.4790390-0.1347590i -0.06847426+0i

[3,] -0.7411992+0.0000000i -0.7411992+0.0000000i -0.24761647+0i

[4,] -0.0567989+0.3756063i -0.0567989-0.3756063i -0.58542406+0i

[,4]

[1,] -0.3347318+0i

[2,] -0.8938356+0i

[3,]  0.1521302+0i

[4,]  0.2566497+0i

5. 数组

矩阵是一个特殊的数组,维度是 2。数组的维度可以大于 2。此外,数组可以为空,而矩阵不可以。

x = matrix(NA, c(0, 3))

Error in matrix(NA, c(0, 3)) : data is too long

x = array(NA, c(0, 3))

x

[,1] [,2] [,3]

array(c(1:30), dim=c(6,5))

[,1] [,2] [,3] [,4] [,5]

[1,]    1    7   13   19   25

[2,]    2    8   14   20   26

[3,]    3    9   15   21   27

[4,]    4   10   16   22   28

[5,]    5   11   17   23   29

[6,]    6   12   18   24   30

a 1:30), dim=c(2,5,3))

a

, , 1

[,1] [,2] [,3] [,4] [,5]

[1,]    1    3    5    7    9

[2,]    2    4    6    8   10

, , 2

[,1] [,2] [,3] [,4] [,5]

[1,]   11   13   15   17   19

[2,]   12   14   16   18   20

, , 3

[,1] [,2] [,3] [,4] [,5]

[1,]   21   23   25   27   29

[2,]   22   24   26   28   30

# 数组索引

a[1,2,1]

[1] 3

a[,3,]

[,1] [,2] [,3]

[1,]    5   15   25

[2,]    6   16   26

6. 列表

data 1,2,3),b=c("one","two"),c=T,d=c(3i+4,9i-9))

data

$a

[1] 1 2 3

$b

[1] "one" "two"

$c

[1] TRUE

$d

[1]  4+3i -9+9i

# 索引

data[[1]]

[1] 1 2 3

data$a

[1] 1 2 3

data["a"]

$a

[1] 1 2 3

# 合并

data T,F,T,T)))

data

$a

[1] 1 2 3

$b

[1] "one" "two"

$c

[1] TRUE

$d

[1]  4+3i -9+9i

$e

[1]  TRUE FALSE  TRUE  TRUE

# 列表转成向量

unlist(list(c(1,2,3), c("one","two"), c(3i+4,9i-9)))

[1] "1"     "2"     "3"     "one"   "two"   "4+3i"  "-9+9i"

7. 数据框

n 2, 3, 5)

s "aa", "bb", "cc")

b TRUE, FALSE, TRUE)

df

df

n  s     b

1 2 aa  TRUE

2 3 bb FALSE

3 5 cc  TRUE

# 矩阵转数据框

data.frame(matrix(1:12, c(3,4)))

X1 X2 X3 X4

1  1  4  7 10

2  2  5  8 11

3  3  6  9 12

# 数据框名称及修改

names(df)

[1] "n" "s" "b"

names(df)[1] "m"

names(df)

[1] "m" "s" "b"

# 索引

df

m  s     b

1 2 aa  TRUE

2 3 bb FALSE

3 5 cc  TRUE

#

df$m

[1] 2 3 5

#

df[["m"]]

[1] 2 3 5

#

df[[1]]

[1] 2 3 5

df[,1]

[1] 2 3 5

# 索引列

df[,1:2]

m  s

1 2 aa

2 3 bb

3 5 cc

# 索引行

df[1:2, ]

m  s     b

1 2 aa  TRUE

2 3 bb FALSE

# 返回向量

as.matrix(df)[1:2,]

m   s    b

[1,] "2" "aa" " TRUE"

[2,] "3" "bb" "FALSE"

# 索引元素

df[1,2]

[1] aa

Levels: aa bb cc

df$s[1]

[1] aa

Levels: aa bb cc

df[[2]][1]

[1] aa

Levels: aa bb cc

df["s"][1,1]

[1] aa

Levels: aa bb cc

df[["s"]][1]

[1] aa

Levels: aa bb cc

# subset 索引

subset(df, n >2 & n < 5)

n  s     b

2 3 bb FALSE

subset(df, n >2 & n < 5, s)

s

2 bb

# 编辑行

rbind(df, data.frame(n = 7, s = "dd", b=T))

n  s     b

1 2 aa  TRUE

2 3 bb FALSE

3 5 cc  TRUE

4 7 dd  TRUE

# 编辑列

cbind(df, f=c("ab","ac","ad" ))

n  s     b  f

1 2 aa  TRUE ab

2 3 bb FALSE ac

3 5 cc  TRUE ad

# 删除

> df

n  s     b

1 2 aa  TRUE

2 3 bb FALSE

3 5 cc  TRUE

# 删除第一列

df[,-1]

s     b

1 aa  TRUE

2 bb FALSE

3 cc  TRUE

# 删除第一行

df[-1,]

n  s     b

2 3 bb FALSE

3 5 cc  TRUE

8. 因子

8.1 无序因子和有序因子(分类型数据)

# 无序因子

a 1,3,5,2,7,2))

a

[1] 1 3 5 2 7 2

Levels: 1 2 3 5 7

a[1] == a[2]

[1] FALSE

a[1] != a[2]

[1] TRUE

# 不能进行大于小于比较

a[1] > a[2]

[1] NA

Warning message:

In Ops.factor(a[1], a[2]) : ‘>’ not meaningful for factors

# 有序因子

b 1,3,5,2,7,2))

b

[1] 1 3 5 2 7 2

Levels: 1 < 2 < 3 < 5 < 7

b 1,3,5,2,7,2))

b

[1] 1 3 5 2 7 2

Levels: 1 < 2 < 3 < 5 < 7

b[1] > b[2]

[1] FALSE

b[1] == b[2]

[1] FALSE

b[1] != b[2]

[1] TRUE

# 无序因子判断

is.factor(a)

[1] TRUE

is.factor(b) # ?

[1] TRUE

# 有序因子判断

is.ordered(a)

[1] FALSE

is.ordered(b)

[1] TRUE

# 因子水平

levels(a)

[1] "1" "2" "3" "5" "7"

levels(a)[2]

[1] "2"

levels(a)[2] "two"

levels(a)

[1] "1"   "two" "3"   "5"   "7"  

a

[1] 1   3   5   two 7   two

Levels: 1 two 3 5 7

8.2 数据离散化(区间)

d 1:30)

d

[1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

[25] 25 26 27 28 29 30

d.cut 0,10,20,30))

d.cut

[1] (0,10]  (0,10]  (0,10]  (0,10]  (0,10]  (0,10]  (0,10]  (0,10]  (0,10]

[10] (0,10]  (10,20] (10,20] (10,20] (10,20] (10,20] (10,20] (10,20] (10,20]

[19] (10,20] (10,20] (20,30] (20,30] (20,30] (20,30] (20,30] (20,30] (20,30]

[28] (20,30] (20,30] (20,30]

Levels: (0,10] (10,20] (20,30]

d.cut[1] < d.cut[2] # 无法进行大于小于比较

[1] NA

Warning message:

In Ops.factor(d.cut[1], d.cut[2]) : ‘for factors

d.cut 0,10,20,30), ordered_result=T)

d.cut

[1] (0,10]  (0,10]  (0,10]  (0,10]  (0,10]  (0,10]  (0,10]  (0,10]  (0,10]

[10] (0,10]  (10,20] (10,20] (10,20] (10,20] (10,20] (10,20] (10,20] (10,20]

[19] (10,20] (10,20] (20,30] (20,30] (20,30] (20,30] (20,30] (20,30] (20,30]

[28] (20,30] (20,30] (20,30]

Levels: (0,10] < (10,20] < (20,30]

d.cut[1] < d.cut[19]

[1] TRUE

# labels

d.cut 0,10,20,30), labels=c("a","b","c"))

d.cut

[1] a a a a a a a a a a b b b b b b b b b b c c c c c c c c c c

Levels: a b c

9. 字符串操作

9.1 字符串长度

data "a bc d"

length(data)

[1] 1

nchar(data)

[1] 6

data "abcd"

nchar(data)

[1] 4

9.2 字符串合并与分割

# 合并

paste("a-","b:","c;","d,", sep = "")

[1] "a-b:c;d,"

paste("a-","b:","c;","d,",data, sep = "")

[1] "a-b:c;d,abcd"

# 分割

data "time: 12h50min24s"

data

[1] "time: 12h50min24s"

strsplit(data, split=": ") # 返回列表

[[1]]

[1] "time"        "12h50min24s"

unlist(strsplit(data, split=": ")) # 转成向量

[1] "time"        "12h50min24s"

data ": "))[2], split="h"))

data

[1] "12"       "50min24s"

# 支持正则表达式?

dsplit ": "))[2], split="h|min|s"))

dsplit

[1] "12" "50" "24"

as.numeric(dsplit)[1]*3600 + as.numeric(dsplit)[2]*60 + as.numeric(dsplit)[3]

[1] 46224

9.3 字符串内部字符的读取和替换

# substr 读取





请到「今天看啥」查看全文