2.数据框、矩阵和列表

1. 数据框

			data.frame 数据框-二维,每列只允许一种数据类型。

1.1 新建数据框

# 代码创建
df <- data.frame(gene = paste0("gene", 1:4),
+                change = rep(c("up","down"),2),
+                score = c(5,3,2,-1)
+                )

> df
   gene change score
1 gene1     up     5
2 gene2   down     3
3 gene3     up     2
4 gene4   down    -1

# 文件读取
df2 <- read.csv("gene.csv")

1.2 数据框属性

df <- data.frame(gene = paste0("gene", 1:4),
+                change = rep(c("up","down"),2),
+                score = c(5,3,2,-1)
+                )
# 数据框的维度:行数 列数
> dim(df)
[1] 4 3

# 数据框的行数
> nrow(df)
[1] 4

# 数据框的列数
> ncol(df)
[1] 3

# 数据框的行名称
> rownames(df)                 
[1] "1" "2" "3" "4"

# 数据框的列名称
> colnames(df)
[1] "gene"   "change" "score" 

1.3 数据框取子集

df <- data.frame(gene = paste0("gene", 1:4),
+                change = rep(c("up","down"),2),
+                score = c(5,3,2,-1)
+                )
genechangescore
gene1up5
gene2down3
gene3up2
gene4down1

(1)按照名字取子集

# 按照列名
> df$score
[1]  5  3  2 -1

> df[,"score"]
[1]  5  3  2 -1

> df[,c("score","gene")]
  score  gene
1     5 gene1
2     3 gene2
3     2 gene3
4    -1 gene4

(2)按照逻辑值取子集

# 取score > 0的数据
> df[df$score>0,]
   gene change score
1 gene1     up     5
2 gene2   down     3
3 gene3     up     2

(3)按照坐标取子集

# 取第二行子集
> df[2,]
   gene change score
2 gene2   down     3

# 取第二列子集
> df[,2]
[1] "up"   "down" "up"   "down"

# 取第二行、第二列的元素
> df[2,2]
[1] "down"

# 取第一行的前两列元素,第二行的前两列元素
> df[1:2,1:2]
   gene change
1 gene1     up
2 gene2   down

# 取第一行的前两列元素,第三行的前两列元素
df[c(1,3),1:2]
   gene change
1 gene1     up
3 gene3     up

(4)坐标未知的取法

> # 取最后一列
> df[,ncol(df)]
[1]  5  3  2 -1

> # 取除最后一列的其他所有列
> df[,-ncol(df)]
   gene change
1 gene1     up
2 gene2   down
3 gene3     up
4 gene4   down

1.4 数据框修改

(1)当行、列均存在时

> #修改一个元素
> df[1,3] <- 8
> df
   gene change score
1 gene1     up     8
2 gene2   down     3
3 gene3     up     2
4 gene4   down    -1

> #修改一列,每一列均为一个向量
> df[,3] <- c(8,8,8,8)
> df
   gene change score
1 gene1     up     8
2 gene2   down     8
3 gene3     up     8
4 gene4   down     8

> df$change <- c("up","up","up","down")
> df
   gene change score
1 gene1     up     8
2 gene2     up     8
3 gene3     up     8
4 gene4   down     8

#修改一行,每一行为一个数据框
> df[1,] <- data.frame("gene5","up",6)
> df
   gene change score
1 gene5     up     6
2 gene2     up     8
3 gene3     up     8
4 gene4   down     8

(2)当行、列不存在时

#修改一行,即新增加一行
> df[5,] <- data.frame("gene5","up",6)
> df
   gene change score
1 gene5     up     6
2 gene2     up     8
3 gene3     up     8
4 gene4   down     8
5 gene5     up     6

> df[8,] <- data.frame("gene5","up",6)
> df
   gene change score
1 gene5     up     6
2 gene2     up     8
3 gene3     up     8
4 gene4   down     8
5 gene5     up     6
6  <NA>   <NA>    NA
7  <NA>   <NA>    NA
8 gene5     up     6


#修改一列,即新增加一列
> df$p <- c(0.1,0.5,0.3,0.5)
> df
   gene change score   p
1 gene5     up     6 0.1
2 gene2     up     8 0.5
3 gene3     up     8 0.3
4 gene4   down     8 0.5

(3)修改行、列名

#修改全部行名
> rownames(df) <- paste0("r",1:4)
> df
    gene change score   p
r1 gene5     up     6 0.1
r2 gene2     up     8 0.5
r3 gene3     up     8 0.3
r4 gene4   down     8 0.5

#修改第三列的列名
> colnames(df)[3] <- "sco"
> df
    gene change sco   p
r1 gene5     up   6 0.1
r2 gene2     up   8 0.5
r3 gene3     up   8 0.3
r4 gene4   down   8 0.5

1.5 数据框连接

# 创建表test1
> test1 <- data.frame(name = c("ming", "gala", "uzi", "xun"),
+                     bloodtype = c("A","B","B","O")
+                  )
                            表 test1
nameblood-type
mingA
galaB
uziB
xunO
# 创建表test2
> test2 <- data.frame(name = c("ming", "gala", "uzi", "xun"),
+                     group = c(1,1,2,2)
+ )
                            表 test2
namegroup
ming1
gala1
uzi2
xun2
# 创建表test3 
> test3 <- data.frame(NAME = c("ming", "gala", "uzi", "xun"),
+                     group = c(1,1,2,2)
+ )
                            表 test3
NAMEgroup
ming1
gala1
uzi2
xun2
# 列名相同时,"name" 为表test1和表test2的共同列名
> merge(test1,test2,by="name")
  name bloodtype group
1 gala         B     1
2 ming         A     1
3  uzi         B     2
4  xun         O     2

# 列名不同时,"name" 为表test1的列名, "NAME"为表test3的列名
> merge(test1,test3,by.x="name",by.y="NAME")
  name bloodtype group
1 gala         B     1
2 ming         A     1
3  uzi         B     2
4  xun         O     2

2. 矩阵

			matrix 矩阵-二维,只允许一种数据类型。

2.1 新建矩阵

# 3 表示创建矩阵的行数
> m = matrix(1:12,3)
> m
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

2.2 矩阵取子集

按照坐标来取子集,与数据框的操作相同。

> m = matrix(1:12,3)
> m
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

> #取第二行
> m[2,]
[1]  2  5  8 11
> 
> #取第二列
> m[,2]
[1] 4 5 6
> 
> #取第二行,第四列的元素
> m[2,4]
[1] 11
> 
> #取第二、三行的二、三列元素
> m[c(2,3),c(2,3)]
     [,1] [,2]
[1,]    5    8
[2,]    6    9

2.3 矩阵转置和转换

(1)矩阵的转置

> m
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
# 转置
> t(m)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
[4,]   10   11   12

(2)矩阵的转换

# 将矩阵转换为数据框
> m = as.data.frame(m)
> class(m)
[1] "data.frame"

(3)矩阵行、列名修改

> m = matrix(1:12,3)
# 修改行名
> rownames(m) <- 1:3
# 修改列名
> colnames(m) <- c("a","b","c","d")
> m
  a b c  d
1 1 4 7 10
2 2 5 8 11
3 3 6 9 12

3. 列表

			list 列表,可由向量、矩阵、数据框混合构成。

3.1 新建列表

# 创建列表l,包含向量c1,矩阵m1,数据框df1
> l <- list(c1 = c(1,23,25,56),
+           m1 = matrix(1:9,3),
+           df1 =data.frame(gene= paste0("gene",1:4))
+           )

> l
$c1
[1]  1 23 25 56

$m1
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

$df1
   gene
1 gene1
2 gene2
3 gene3
4 gene4

3.2 列表取子集

> l <- list(c1 = c(1,23,25,56),
+           m1 = matrix(1:9,3),
+           df1 =data.frame(gene= paste0("gene",1:4))
+           )

# 按照名称取子集
> l$c1 # 直接取出向量c1 的元素
[1]  1 23 25 56

# 按照坐标取
> l[1] # 取出向量c1整体
$c1
[1]  1 23 25 56
> class(l[1])
[1] "list" #本质上还是向量

> l[[1]] # 取出向量c1 的元素
[1]  1 23 25 56
> class(l[[1]])
[1] "numeric" #本质上是向量的元素值

from 生信技能树课程

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值