一、数据框排序
法一:sort函数
默认升序。
例:sort(test$Sepal.Length)
法二:order函数
默认升序,返回数据下标组成的数组。
可以给向量排序,也可以给数据框排序
例:test[order(test$Sepal.Length),] ##升序
test[order(test$Sepal.Length,decreasing = T),] ##降序
法三:arrange函数
语法优化,实现更加灵活的排序
library(dplyr)
arrange(test, Sepal.Length) ##升序
arrange(test, desc(Sepal.Length)) ##desc实现降序
arrange(test, desc(Sepal.Width),Sepal.Length) ##先按Width降序,Width取值相同的数据,按照Length升序排列
注:注意取列名时没有引号也没有$。且这里加引号也不会报错,只是不会排序
二、数据框更改
新增:mutate函数
例:mutate(test,new=xx*yy)
筛选列:select函数
筛选行:filter函数
管道函数:%>%,将处理返回值传递给管道符号后面的函数的第一个参数
例:dat = t(exp) %>%
as.data.frame() %>%
rownames_to_column() %>%
mutate(group = rep(c("control","treat"),each = 3))
三、表达矩阵画箱线图
由于ggplot2处理的数据是一个数据框,横纵坐标是单独的一行/列,所以需要对表达矩阵做处理
例: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
注: ##rnorm取出的值是随机的,每次运行结果都不相同,设置set.seed()可以让随即结果固定,里边的数字随便填
数据处理过程:转置把原来的列变成行
例:
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"), ##gene1,gene2,gene3合并成一列
names_to = "gene",
values_to = "count")
四、文件连接
法一:merge()函数
法二:join函数
注:join函数需要加载dplyr包,left_join左连接(以左数据框为模板),right_join右连接(以右数据框为模板)full_join全连接(取并集)inner_join(取交集),没有的值为NA
五、字符串
1.str_length(x)
返回向量中字符的数目,空格和标点都算一个字符
区别于length(x),如果x为一个向量,则返回值为1
2.str_split(x,"")
按照空格为界,进行拆分
例:str_split(y," ",simplify = T) ##y是目标向量,simplify将结果转化为数据框
拆分结果为列表,里面有一个元素[[1]]
提取方法:x2 = str_split(x," ")[[1]];x2
3str_sub(x,5,9)
把一个向量从第5位取到第9位
4.str_detect(x2,"h")
检测x2里每个元素是否都含有字母“h”,含有返回TRUE,不含返回FALSE
str_starts(x2,"h")
检测x2里每个元素是否都以字母“h”开头
str_ends(x2,"h")
检测x2里每个元素是否都以字母“h”结尾
5.str_replace(x2,"o","A")
把字符串中的o替换成A,如果该字符串有多个o,只替换第一个
str_replace_all(x2,"o","A")
把字符串中所有的o替换成A
6.str_remove(x," ")
把字符串中的空格删掉,如果该字符串有多个空格,只删除第一个
str_remove_all(x," ")
把字符串中所有的空格删掉
字符改为大写:
toupper(x)
字符改为小写:
tolower(x)
六、条件语句
法一:if(一个逻辑值){ }
else {}
法二:
if (一个逻辑值){}
else if (一个逻辑值) {}
else if (一个逻辑值) {}
法三:ifelse()函数
ifelse(x,yes,no)
x:逻辑值
yes:逻辑值为TRUE时的返回值
no:逻辑值为FALSE时的返回值
例:ifelse(i>0,"+","-")
如何挑出一个表达矩阵里方差最大的1000个基因?
load("test2.Rdata")
x=names(tail(sort(apply(test,1,var)),1000))
head(x)
七、循环
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)
##do.call批量处理简化列表
##cbind按列拼接函数
补:长脚本管理方式
1.分成多个脚本,每个脚本最后保存Rdata,下一个脚本开头清空再加载。
2.if (F){...} 则{}里的脚本被跳过
if (T){...} 则{}里的脚本被执行
凡是带有{}的代码,均可以被折叠
2.隐式循环
(1)apply(X,MARGIN,FUN,...)函数
X是数据框/矩阵名
MARGIN为1表示行,2表示列
FUN是函数,对X的每一行/列进行FUN这个函数
apply(test, 2, mean)
(2)lapply()对列表进行循环的操作,返回列表
(3)sapply()返回向量