一、数据框排序

  1. order 可以给向量排序,也可以给数据框排序
  2. sort(test$Sepal.Length)
  3. test$Sepal.Length[order(test$Sepal.Length)]
  4. test[order(test$Sepal.Length),]
  5. test[order(test$Sepal.Length,decreasing = T),]
  6. # arrange,更加灵活的排序
  7. library(dplyr)
  8. arrange(test, Sepal.Length)
  9. arrange(test, desc(Sepal.Length))
  10. arrange(test, desc(Sepal.Width),Sepal.Length)##A列相同的,按B列排列
  11. test = mutate(test, new = xx * yy)##新增列
  12. select()#筛选列
  13. filter()#筛选行
  14. ##管道符号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")#反连接

四、对字符串的操作

字符串.png

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反之

八、重点

重点.png

代码及图片均来自于生信技能树小洁老师