Part2:数据类型和向量
1.数据类型
-
三种类型
- 数值型:1 ,2
-
字符型:’a' 'm'
-
逻辑型
TRUE: T
FALSE:F
NA
-
-
判断数据类型函数:class()
- 逻辑运算 多个逻辑条件的连接与&、或|、非!
-
判断函数
- is.numeric()
- is.logical()
- is.charactor()
-
转换
- as.numeric()
- as.logical()
- as.charactor()
2.数据结构
- 向量
- 向量则是数据框单独拿出的一列,视为一个整体
- 一个向量只能有一种数据类型,可以有重复值
- 数据框
- 数据框约等于表格
- 矩阵
- 列表
3.向量
-
2.1向量的生成
- 用c()逐一放到一起
- 连续的数字用冒号”:”
- 有重复的用rep(),有规律的序列用seq(),随机数用rnorm
- rep("gene",times=3)
- seq(from=3,to=21,by=3)
- rnorm(n=3)
-
paste0()
-
tips:数据类型转换的优先顺序
- 数值型和逻辑型优先转换为字符型
- 逻辑型优先转换为数值型
-
2.2对一个向量进行的操作
-
1.赋值
- x = c(1,3,5,6,2) #随意的写法
- x <- c(1,3,5) #规范的赋值符号
- 赋值+输出一起执行:
- (x <- c(1,3,5))
- x <- c(1,3,5);x
-
2.简单数学计算
> x+1 [1] 2 4 6 2 > log(x) [1] 0.000000 1.098612 1.609438 0.000000 > sqrt(x) [1] 1.000000 1.732051 2.236068 1.000000
-
-
3.根据某条件进行判断,生成等长的逻辑向量
> x>3 [1] FALSE FALSE TRUE FALSE > x==3 [1] FALSE TRUE FALSE FALSE
-
4.初级统计
max(x) #最大值 min(x) #最小值 mean(x) #均值 median(x) #中位数 var(x) #方差 sd(x) #标准差 sum(x) #总和 >length(x) #长度 [1] 4 > unique(x) #去重复 [1] 1 3 5 > duplicated(x) [1] FALSE FALSE FALSE TRUE > table(x) #重复值统计 x 1 3 5 2 1 1 > sort(x) [1] 1 1 3 5
-
2.3对两个向量进行的操作
-
1.逻辑比较,生成等长的逻辑向量
x = c(1,3,5,1) y = c(3,2,5,6) x == y [1] FALSE FALSE TRUE FALSE x %in% y #x的元素是否在y中 [1] FALSE TRUE TRUE FALSE
-
-
2.数学计算
x + y
-
3.“连接”
paste(x,y,sep=":") [1] "1:3" "3:2" "5:5" "1:6"
-
4.交集、并集、差集
intersect(x,y) [1] 3 5 union(x,y) [1] 1 3 5 2 6 setdiff(x,y) [1] 1 setdiff(y,x) [1] 2 6
5.当两个向量长度不一致:循环补齐
* 利用循环补齐简化代码
4.向量筛选
(取子集) [ ]:将TRUE对应的值挑选出来,FALSE丢弃
根据逻辑值:中括号里是与x等长的逻辑值向量
- 根据位置:中括号里是由x的下标组成的向量
5.修改向量中的元素
-
修改某个元素
x =8:12;x [1]8 9 10 11 12 x[4] <- 40 取子集+赋值
-
修改某些元素
x =8:12;x [1]8 9 10 11 12 改符合某个逻辑条件的多个元素 x[x>10] <- 10
6.简单向量作图
> k1 = rnorm(12)
> k2 = rep(c("a","b","c","d"),each = 3)
> plot(k1)
> boxplot(k1~k2)
7.向量匹配排序
match:谁在外面,谁就在后面
y[match(x,y)]
8.矩阵(matrix)
所有列的数据类型相同,两个维度(行数和列数)
-
矩阵新建和取子集
m <- matrix(1:9, nrow = 3) m[2, ] m[, 1] m[2, 3] m[2:3,1:2]
-
矩阵的转置和转换
t(m) #将行变成列,列变成行 as.data.frame(m) #将矩阵转换为数据框
-
矩阵画热图
pheatmap::pheatmap(m) pheatmap::pheatmap(m,cluster_cols = F,cluster_rows = F) #默认的设置不符合你心意,那就自定义
9.数据框(data.frame)
多个长度相同、数据类型可以不同的向量按列组合
1.数据框来源
(1)在R中新建
(2)由已有数据转换或处理得到
(3)从文件中读取
(4)内置数据集
2.新建数据框
-
本质上是向量按列组合
df <- data.frame(gene =c("gene1","gene2","gene3"), sam = c("sample1","sample2","sample3"), exp = c(32,34,45)) df <- data.frame(gene = paste0("gene",1:3), sam = paste0("sample",1:3), exp = c(32,34,45))
读取数据框
df2 <- read.csv("gene.csv")
3.数据框属性描述
-
维度(有几行几列)
dim(df) nrow(df) /ncol(df)
行名/列名
rownames(df)/colnames(df)
4.数据框取子集(一个、一行、一列)
4.1
df[2,2] #数据框[行,列]
df [2,] #取第二行 df [,2] #取第二列
df[c(1,3),1:2] #对行和列进行选择
4.2根据行名或列名
df[,“exp”]
df[,c(“gene”,“exp”)]
进阶—理解以下代码
df[,ncol(df)] #选取最后一列
df[,-ncol(df)] #删除最后一列
4.3提取列的常用操作
df$exp
能对向量进行的计算和统计,都能对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) 总和
5.数据框编辑
- 取子集$或[] +赋值操作
df[3,3]<- 5
df$abc <-c(23,15,37)
df$abc <-c(23,15,37) #新增一列,如果原数据框没有这个列名
-
误操作该怎么办?
- 对df多次赋值,以最后一次为准
- 运行了错误的代码,不能撤销,但可以覆盖或重来
-
修改行名和列名
rownames(df) <- c("r1","r2","r3") #改全部行名 rownames(df)[2] <-"x" #改一个行名
6.数据框进阶
-
行数较多的数据框可截取前/后几行查看
head(data.frame) #查看数据框全部的行 head(data.frame,3) #查看数据框的前3行
-
行列数都多的数据框可取前几行前几列查看
iris[1:3,1:3] #数据框[]
-
查看每一列的数据类型和具体内容
str(df)
-
去除含有缺失值的行:
na.omit(df) #仅按照某一列来去除缺失值、缺失值替换:tidyr包
-
两个表格的连接
cbind #按列连接,行数相同 rbind #按行连接,列数相同 merge(test1,test2,by="name") #共同列的列名 merge(test1,test3,by.x = "name",by.y = "NAME")
6)如果列名顺序错乱,如何按照指定顺序重排?
https://mp.weixin.qq.com/s/rA92iZS8HUiuwlyrPirHdA
10.列表(list)
长度可以不同、数据类型可以不同 向量 数据框 矩阵或数据框 列表 没有行和列的概念,可以有多级元素
-
列表新建和取子集
l <- 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)) [[2]] l$df #取子集
11.删除变量
rm(l) #删除一个
rm(df,m) #删除多个
rm(list = ls()) #删除全部
ctrl+l #清空控制台
12.元素的“名字”-names()
元素可命名,用函数names(),可根据名字提取子集,向量、数据框、列表通用。