数据框、矩阵和列表
1.数据框
1.1 来源
(1)在R中新建
(2)由已有数据转换或处理得到
(3)从文件中读取
(4)内置数据集
1.2 新建与读取数据框
options(stringsAsFactors = FALSE)#在读入数据时,遇到字符串之后,不将其转换为factors,仍然保留为字符串格式
新建方式1
df <- data.frame(gene = c("gene1","gene2","gene3"),#gene,sam,exp是列名
sam = c("sample1","sample2","sample3"),
exp = c(32,34,45))
df
新建方式2
df <- data.frame(gene = paste0("gene",1:3),
sam = paste0("sample",1:3),
exp = c(32,34,45))
df
读取
df2 <- read.csv("gene.csv")
df2
1.3 数据框属性的描述
1) 维度;dim(行,列)nrow/ncol
> dim(df)
[1] 3 3
2)行、列名;rownames(df)/colnames(df)
> rownames(df)
[1] "1" "2" "3"
> colnames(df)
[1] "gene" "sam" "exp"
2)数据框取子集
# 一个维度是一个向量,向量取子集:e.g. x[5]
# 数据框取子集:x[3,5],这表示数据框x内的[第三行,第五列]
1.4.数据框取子集;一个维度为一个向量
#1)定点
> df[2,2]
[1] "sample2"
#2)定行
> df[2,]
gene sam exp
2 gene2 sample2 34
#3)定列
> df[,2]
[1] "sample1" "sample2" "sample3"
#4)隔着取
> df[c(1,3),1:2]#因为是每个维度都是向量,且向量不相隔,所以c(1,3)
gene sam
1 gene1 sample1
3 gene3 sample3
#5)根据行名或列名取子集
#当行数和列数很多时,这个操作就很有用
> df[,"gene"]
[1] "gene1" "gene2" "gene3"
> df[,c('gene','exp')]
gene exp
1 gene1 32
2 gene2 34
3 gene3 45
# 6)进阶,提取或者删除最后一行/列
> ncol(df)
[1] 3
> df[,ncol(df)] #提取最后一列
[1] 32 34 45
> df[,-ncol(df)] #删除最后一列
gene sam
1 gene1 sample1
2 gene2 sample2
3 gene3 sample3
# 7)提取列的常用操作
> df$exp #符号$,按Tab键选中
[1] 32 34 45
# 8)能对向量进行的计算和统计,都能对df$exp做
• max(df$exp) 最大值
• min(df$exp) 最小值
• range(df$exp) 数值的范围
• mean(df$exp) 均值
• median(df$exp) 中位数
• var(df$exp) 方差
• sd(df$exp) 标准差
• length(df$exp) 长度
• sum(df$exp) 总和
1.5 数据框编辑
#编辑方式:取子集$或[] +赋值操作
a.修改数据
1)改一个格
> df[3,3]<- 5
> df
gene sam exp
1 gene1 sample1 32
2 gene2 sample2 34
3 gene3 sample3 5
2)改一整列
> df$exp<-c(12,23,50);df
gene sam exp
1 gene1 sample1 12
2 gene2 sample2 23
3 gene3 sample3 50
3)直接增加一列
> df$abc <-c(23,15,37);df
gene sam exp abc
1 gene1 sample1 12 23
2 gene2 sample2 23 15
3 gene3 sample3 50 37
b.修改行/列名称
> rownames(df)
[1] "1" "2" "3"
> colnames(df)
[1] "gene" "sam" "exp" "abc"
> rownames(df) <- c("r1","r2","r3") #行名
> rownames(df)
[1] "r1" "r2" "r3"
> df
gene sam exp abc
r1 gene1 sample1 12 23
r2 gene2 sample2 23 15
r3 gene3 sample3 50 37
> rownames(df)[2] = "x" #注意该结构
> df
gene sam exp abc
r1 gene1 sample1 12 23
x gene2 sample2 23 15
r3 gene3 sample3 50 37
-
练习题
1.读取excise.csv,赋值给df。
> df=read.csv("excise.csv")
> df
gene s1 s2 s3
1 gene1 -0.02258879 0.96133416 -1.1586647
2 gene2 -1.74022070 -0.88615577 0.2377606
3 gene3 -1.31557781 1.43889437 0.8751975
4 gene4 -0.07796823 -1.03993791 0.5053183
5 gene5 -0.60799720 0.46511225 0.4009092
6 gene6 -0.58853428 -0.05467347 -0.4162721
2.提取行名和列名
> rownames(df)
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13"
[14] "14" "15"
> colnames(df)
[1] "gene" "s1" "s2" "s3"
3.提取第二行
> df[2,]
gene s1 s2 s3
2 gene2 -1.740221 -0.8861558 0.2377606
4.提取第3行第4列
> df[3,4]
[1] 0.8751975
5.求第二列最大值和最小值
> max(df[,2]) #最大值
[1] 2.14664
> min(df[,2]) #最小值
[1] -1.819106
> range(df[,2]) #极值
[1] -1.819106 2.146640
6.按照列名提取s1,s3列
> df[,c("s1","s3")]
s1 s3
1 -0.02258879 -1.1586647
2 -1.74022070 0.2377606
3 -1.31557781 0.8751975
4 -0.07796823 0.5053183
5 -0.60799720 0.4009092
6 -0.58853428 -0.4162721
7.修改后三列列名为“sample1”,“sample2”,“sample3”
方法一:直接赋值
> colnames(df) <- c("gene","sample1","sample2","sample3") #应该有更好的办法
> colnames(df)
[1] "gene" "sample1" "sample2" "sample3"
方法二:推荐这种取子集
colnames(df)[2:4] <- c("sample1","sample2","sample3")
> head(df)
gene sample1 sample2 sample3
1 gene1 -0.02258879 0.96133416 -1.1586647
2 gene2 -1.74022070 -0.88615577 0.2377606
3 gene3 -1.31557781 1.43889437 0.8751975
4 gene4 -0.07796823 -1.03993791 0.5053183
5 gene5 -0.60799720 0.46511225 0.4009092
6 gene6 -0.58853428 -0.05467347 -0.4162721
8.筛选sample3列大于0的行
> df$sample3>0
[1] FALSE TRUE TRUE TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE
[12] TRUE FALSE TRUE TRUE
> df$sample3[df$sample3>0]
[1] 0.2377606 0.8751975 0.5053183 0.4009092 0.3391273 0.1525497
[7] 0.3251973 0.3016595 0.6108655 0.1627136 0.9300770
1.6 数据的进阶
(1) 转置--行变列,列变行: t(df)
> df1=read.csv("gene.csv")
> df1
gene sam exp
1 gene1 sample1 32
2 gene2 sample2 34
3 gene3 sample3 45
> t(df1)
[,1] [,2] [,3]
gene "gene1" "gene2" "gene3"
sam "sample1" "sample2" "sample3"
exp "32" "34" "45"
(2)去除含有缺失值的行: na.omit(df)
> df2=read.csv("na.omit.csv")
> df2
x1 x2
1 A 1
2 B NA
3 C 3
4 4
5 E 5
> na.omit(df2)# 按行删除;仅按照某一列来去除缺失值、缺失值替换: tidyr包
x1 x2
1 A 1
3 C 3
4 4
5 E 5
(3)两个表格的连接:
#交集、并集、补集、全集等,参照dplyr包
按列连接: cbind 行数相同
按行连接: rbind 列数相同
merge() 根据某一相同列合并
如下图所示
(4)行数较多的数据框可截取前/后几行查看
> head(df)
gene sample1 sample2 sample3
1 gene1 -0.02258879 0.96133416 -1.1586647
2 gene2 -1.74022070 -0.88615577 0.2377606
3 gene3 -1.31557781 1.43889437 0.8751975
4 gene4 -0.07796823 -1.03993791 0.5053183
5 gene5 -0.60799720 0.46511225 0.4009092
6 gene6 -0.58853428 -0.05467347 -0.4162721
> df[1:3,1:3]
gene sample1 sample2
1 gene1 -0.02258879 0.9613342
2 gene2 -1.74022070 -0.8861558
3 gene3 -1.31557781 1.4388944
(6) 查看每一列的数据类型和具体内容
> str(df)
'data.frame': 15 obs. of 4 variables:
$ gene : chr "gene1" "gene2" "gene3" "gene4" ...
$ sample1: num -0.0226 -1.7402 -1.3156 -0.078 -0.608 ...
$ sample2: num 0.961 -0.886 1.439 -1.04 0.465 ...
$ sample3: num -1.159 0.238 0.875 0.505 0.401 ...
(7)如果列名顺序错乱,如何按照指定顺序重排?
#上一期可以讲过了
(8)总结一些函数
t() #转置
head(),tail() #截取头/ 尾
cbind(),rbind(),merge() #连接
str() #查看详情
1.7 矩阵、列表新建和取子集
1)矩阵新建
> m <- matrix(1:9, nrow = 3)
> m
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
取子集
> m[1,3]
[1] 7
> m[,2]
[1] 4 5 6
> m[3,]
[1] 3 6 9
> m[1:2,2:3]
[,1] [,2]
[1,] 4 7
[2,] 5 8
2)列表新建
> i <- list(m=matrix(1:9, nrow = 3),df=data.frame(gene=paste0("gene",1:3),sam=paste0("sample",1:3),exp=c(32,34,45)),x=c(1,3,5))
表达一
> i
$m
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
$df
gene sam exp
1 gene1 sample1 32
2 gene2 sample2 34
3 gene3 sample3 45
$x
[1] 1 3 5
> i[1]
表达二
> i[2]
$df
gene sam exp
1 gene1 sample1 32
2 gene2 sample2 34
3 gene3 sample3 45
> i[[2]]
gene sam exp
1 gene1 sample1 32
2 gene2 sample2 34
3 gene3 sample3 45
> i$df
gene sam exp
1 gene1 sample1 32
2 gene2 sample2 34
3 gene3 sample3 45
-
删除函数
- 删除一个 rm(l)
- 删除多个 rm(df,m)
- 删除全部 rm(list = ls())
- 清空控制台 ctrl+l
新建 | 取子集 | |
---|---|---|
向量x | x<-c( ) | x[n] 修改元素 |
数据框df | df<-data.frame( ) | df[x,y] , df[x,] ,df[,y], $ 新增列,修改 |
矩阵 m | m<–matrix( ) | m[x,y]… |
列表 l | l<-list( ) | l[[n]], $ |
1.8 元素的“名字”-names()
元素可命名,用函数names()
可根据名字提取子集,
向量、数据框、列表通用。
> x = c(1,3,5);x
[1]1 3 5
> names(x) = c("a","b","c")
> x
a b c
1 3 5