赋值快捷键:Alt + -
在循环里面,用两个[[]]取向量的子集
if 与 ifelse 不同,ifelse可支持多个逻辑值组成的向量
a = round(rnorm(20),2)
#如何从20个数里挑选最大的5个
#从小到大排序,取最后的5个
sort(a)[16:20]
head(sort(a,decreasing = T),5) #取前五
tail(sort(a),5)#取后5
load("test2.Rdata")
library(tidyverse)
apply(test,1,var)%>%
sort() %>%
tail(1000)%>%
names()
字符串
rm(list = ls())
if(!require(stringr))install.packages('stringr')
library(stringr)
x <- "The birch canoe slid on the smooth planks."
x
### 1.检测字符串长度
str_length(x) #检测向量中的每个元素的字符串
length(x) #返回的是向量里的1个元素
### 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)#simplify = T 成为一个矩阵
### 3.按位置提取字符串
str_sub(x,5,9)
str_sub(y,5,9) #对向量中的每一个元素按照位置提取字符串
### 4.字符检测 返回逻辑值
str_detect(x2,"h") #是否包含
str_starts(x2,"T") #是否以T开头
str_ends(x2,"e") #是否以e结尾
### 5.字符串替换
x2
str_replace(x2,"o","A") #替换x2中的o为A,默认只替换其中的第一个o
str_replace_all(x2,"o","A") #替换匹配到的所有结果
### 6.字符删除
x
str_remove(x," ")
str_remove_all(x," ")
###7.转换成小写
str_to_lower()
tolower()
数据框
test <- iris[c(1:2,51:52,101:102),]
rownames(test) =NULL # 去掉行名,NULL是“什么都没有”
test
# arrange,数据框按照某一列排序
library(dplyr)
arrange(test, Sepal.Length) #默认从小到大
arrange(test, desc(Sepal.Length)) #从大到小 sort 有decreasing=F函数
# distinct,数据框按照某一列去重复
distinct(test,Species,.keep_all = T)#.keep_all = T 保持所有列
distinct(test,Species)
# mutate,数据框新增一列
mutate(test, new = Sepal.Length * Sepal.Width)
test$new= test$Sepal.Length * test$Sepal.Width
# 连续的步骤
# 1.多次赋值,产生多个变量
x1 = filter(iris,Sepal.Width>3) #筛选行
x2 = select(x1, Sepal.Length,Sepal.Width) #选择列
x3 = arrange(x2,Sepal.Length) #按照Sepal.Length排序
# 2.管道符号传递,简洁明了 ctrl+shift+M
x = iris %>% #把前面一个函数结果传递给后一个函数的第一个参数
filter(Sepal.Width>3) %>%
select(Sepal.Length,Sepal.Width)%>%
arrange(Sepal.Length)
# 3. 嵌套,代码不易读
arrange(select(filter(iris,Sepal.Width>3),
Sepal.Length,Sepal.Width),
Sepal.Length)
条件和循环
rm(list = ls())
## 一.条件语句
###1.if(){ }
#if 与 ifelse 不同,ifelse可支持多个逻辑值组成的向量
#### (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("-")
}
i = 1
ifelse(i>0,"+","-")
x = rnorm(3)
x
ifelse(x>0,"+","-") #输出结果和x长度一致
#if 与 ifelse 不同,ifelse可支持多个逻辑值组成的向量
#ifelse()+str_detect(),王炸
samples = c("tumor1","tumor2","tumor3","normal1","normal2","normal3")
k1 = str_detect(samples,"tumor");k1
ifelse(k1,"tumor","normal")
k2 = str_detect(samples,"normal");k2 #需要注意要对应关系正确,TURE是代表的什么
ifelse(k2,"normal","tumor")
#### (3)多个条件
i = 0
#嵌套if else 或者函数ifelse,==判断等于
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
x <- c(5,6,0,3)
result = list()
for(i in 1:length(x)){
s=s+x[[i]]
result[[i]] = c(x[[i]],s)
}
result
do.call(cbind,result) #把result里的每一个元素按列拼接起来,向量长度需要一样
#在循环里面,用两个[[]]取向量的子集
#列表生成的3种方式
#第一种
a = list(a1=1:10,
a2=3:8)
#第二种
b=list(1:10,3:8)
names(b)=c("b1","b2")
#第三种 生成空列表,可以一个个填入元素
d = list()
d[[1]] = 1:10
d[[2]] = 3:8
names(d)=c("d1","d2")
构建表达矩阵
# 表达矩阵
set.seed(10086)#随机种子,固定rnorm数
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#前三列在原来的数值上加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")
隐式循环
1.apply 处理矩阵或数据框
1.apply 处理矩阵或数据框rm(list = ls())
## 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, …) 对列表/向量中的每个元素(向量)实施相同的操作
### 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 简化结果,返回矩阵或向量
### 3.sapply 简化结果,返回矩阵或向量
sapply(test,mean)
sapply(test,fivenum)
class(sapply(test,fivenum))
两个数据框的连接
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
merge(test1,test2,by="name")
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") #半连接 取在test2中的test1的信息
anti_join(test1,test2,by="name") #反连接 取不存在于test2中的test1的信息
其他
# 1.match-----
load("matchtest.Rdata")
x
y
## 如何把y的列名正确替换为x里面的ID?
## (1)分步解法
a = colnames(y)
b = x$file_name
k = match(a,b);k
#match(a,b)的意思是a里的每个元素在b的第几个位置上。
#是b的下标,可以给b取子集,也可以给与b对应的其他向量取子集。
colnames(y) = x$ID[k]
## (2)一步解法
load("matchtest.Rdata")
colnames(y) = x$ID[match(colnames(y),x$file_name)]
## (3)放弃match的解法
load("matchtest.Rdata")
rownames(x) = x$file_name
x = x[colnames(y),]
colnames(y) = x$ID
# 2.一些搞文件的函数----
dir() # 列出工作目录下的文件
dir(pattern = ".R$") #列出工作目录下以.R结尾的文件
file.create("douhua.txt") #用代码创建文件
file.exists("douhua.txt") #某文件在工作目录下是否存在
file.remove("douhua.txt") #用代码删除文件
file.exists("douhua.txt") #删掉了就不存在啦
## 可以批量的新建和删除
f = paste0("douhua",1:100,".txt")
file.create(f)
file.remove(f)