一、数据框排序
order 可以给向量排序,也可以给数据框排序
sort(test$Sepal.Length)
test$Sepal.Length[order(test$Sepal.Length)]
test[order(test$Sepal.Length),]
test[order(test$Sepal.Length,decreasing = T),]
# arrange,更加灵活的排序
library(dplyr)
arrange(test, Sepal.Length)
arrange(test, desc(Sepal.Length))
arrange(test, desc(Sepal.Width),Sepal.Length)##A列相同的,按B列排列
test = mutate(test, new = xx * yy)##新增列
select()#筛选列
filter()#筛选行
##管道符号x = y %>% filter(a>0) %>% select(c,d) %>% arrange(e)##将数据传递给管道符号后面的函数
二、表达矩阵画箱线图
步骤:行列互换—把原来的行名变成第一列—宽变长
代码如下
set.seed(10086)
exp = matrix(rnorm(18),ncol = 6)
exp = round(exp,2)
rownames(exp) = paste0("gene",1:3)
colnames(exp) = paste0("test",1:6)
exp[,1:3] = exp[,1:3]+1
exp
library(tidyr)
library(tibble)
library(dplyr)
dat = t(exp) %>%
as.data.frame() %>%
rownames_to_column() %>%
mutate(group = rep(c("control","treat"),each = 3))
pdat = dat%>%
pivot_longer(cols = starts_with("gene"),
names_to = "gene",
values_to = "count")#宽变长函数
library(ggplot2)
p = ggplot(pdat,aes(gene,count))+
geom_boxplot(aes(fill = group))+
theme_bw()
p
p + facet_wrap(~gene,scales = "free")##分图
三、连接
test1 <- data.frame(name = c('jimmy','nicker','Damon','Sophie'),
blood_type = c("A","B","O","AB"))
test1
test2 <- data.frame(name = c('Damon','jimmy','nicker','tony'),
group = c("group1","group1","group2","group2"),
vision = c(4.2,4.3,4.9,4.5))
test2
library(dplyr)
inner_join(test1,test2,by="name")#交集
right_join(test1,test2,by="name")#右连接
full_join(test1,test2,by="name")#全连接
semi_join(test1,test2,by="name")#半连接
anti_join(test1,test2,by="name")#反连接
四、对字符串的操作
library(stringr)
x <- "The birch canoe slid on the smooth planks."
x
###1.检测字符串长度
str_length(x)
length(x)
###2.字符串拆分
str_split(x," ")
x2 = str_split(x," ")[[1]];x2
y = c("jimmy 150","nicker 140","tony 152")
str_split(y," ")
str_split(y," ",simplify = T)#以矩阵的形式显示
###3.按位置提取字符串
str_sub(x,5,9)
###4.字符检测
str_detect(x2,"h")#返回与x2向量等长的逻辑值向量
###5.字符串替换
str_replace(x2,"o","A")#只替换第一次出现的
str_replace_all(x2,"o","A")
###6.字符删除
str_remove(x," ")
str_remove_all(x," ")
五、条件语句和循环语句
## 一.条件语句
###1.if(){ }#括号里是一个逻辑值
#### (1)只有if没有else,那么条件是FALSE时就什么都不做
i = -1
if (i<0) print('up')
if (i>0) print('up')
#理解下面代码
if(!require(tidyr)) install.packages('tidyr')
#### (2)有else
i =1
if (i>0){
print('+')
} else {
print("-")
}#FALSE就运行else后面的代码
ifelse(x, yes, no)##x是逻辑值,yes是逻辑值为TRUE时的返回值,no是逻辑值为FALSE时的返回值
ifelse(i>0,"+","-")
x=rnorm(3)
ifelse(x>0,"+","-")
#### (3)多个条件
i = 0
if (i>0){
print('+')
} else if (i==0) {
print('0')
} else if (i< 0){
print('-')
}
ifelse(i>0,"+",ifelse(i<0,"-","0"))
## 二、循环语句
### 1.for循环
x <- c(5,6,0,3)
s=0
for (i in x){
s=s+i
print(c(i,s))
}
x <- c(5,6,0,3)
s = 0
for (i in 1:length(x)){
s=s+x[[i]]
print(c(x[[i]],s))
}###以下标形式循环,以列表的形式显示
#如何将结果存下来?
s = 0
result = list()
for(i in 1:length(x)){
s=s+x[[i]]
result[[i]] = c(x[[i]],s)
}
result
do.call(cbind,result)##转换成矩阵
六、隐式循环
## apply()族函数
### 1.apply 处理矩阵或数据框
#apply(X, MARGIN, FUN, …)
#其中X是数据框/矩阵名;
#MARGIN为1表示行,为2表示列,FUN是函数
test<- iris[1:6,1:4]
apply(test, 2, mean)
apply(test, 1, sum)
### 2.lapply(list, FUN, …)
# 对列表/向量中的每个元素(向量)实施相同的操作
test <- list(x = 36:33,y = 32:35,z = 30:27);test
#返回值是列表,对列表中的每个元素(向量)求均值(试试方差var,分位数quantile)
lapply(test,mean)
lapply(test,fivenum)
### 3.sapply 简化结果,直接返回矩阵或向量
sapply(test,mean)
sapply(test,fivenum)
class(sapply(test,fivenum))
七、长脚本管理方式
1.分成多个脚本,每个脚本最后保存Rdata,下一个脚本开头清空对象在加载
2.if(F/T){},如果为F,大括号里的脚本将被跳过,T反之
八、重点
代码及图片均来自于生信技能树小洁老师