玩转字符串
1.检测字符串长度
str_length(x)
length(x)# 字符的个数
2.字符串拆分
str_split(x," ") # 把42个字符 按照“空格”拆分成八个字符串
class(str_split(x," ")) #确认是什么数据组合类型
x2 = str_split(x," ")[[1]];x2 #是list 所以用[[]]
y = c("jimmy 150","nicker 140","tony 152")
str_split(y," ")
str_split(y," ",simplify = T) #简化结果
拆分后的y需要赋值,不然还是原来的y
3.按位置提取字符串
str_sub(x,5,9) #空格也要算上 x字符串里5-9位置
4.字符检测
str_detect(x2,"h") # h类似于地雷,扫雷探测,含有h的就会变成TURE,生成长度相等的逻辑值向量,可以用来取子集,可以提出来含有h的地雷
str_starts(x2,"T") #是否以t开头
str_ends(x2,"e")#是否e结束
5.字符串替换
x2
str_replace(x2,"o","A") #如果向量里的一个数据有两个o,只替换第一个
str_replace_all(x2,"o","A") #如果向量里的一个数据有两个o,都替换
str_replace_all(x2,"o|e","A") # 竖线 代表着或者
6.字符删除
str_remove(x," ")
str_remove_all(x," ")
玩转数据框
arrange,数据框按照某一列排序
sort是给向量排序的
library(dplyr)
arrange(test, Sepal.Length) #默认根据这一列从小到大给整个数据框排序
arrange(test, desc(Sepal.Length)) #从大到小
distinct,数据框按照某一列去重复
unique 给向量去掉重复
duplicated 判断是否发生了重复(逻辑值关系,遇到第二次就变成ture)
distinct(test,Species,.keep_all = T)
mm[!duplicated(mm)] 提取没有重复的第一次出现的
mutate,数据框新增一列
mutate(test, new = Sepal.Length * Sepal.Width)
new是新产生的列名
新加之后,如果没有赋值,那么这个数据框还是没有新加,没有赋值,就没有产生
补充
select()
filter()
如何简化连续的步骤
1. 多次赋值,会产生多个中间的变量
x1 = select(iris,-5)
x2 = as.matrix(x1)
x3 = head(x2,50)
pheatmap::pheatmap(x3)
2. 嵌套,代码不易读
pheatmap::pheatmap(head(as.matrix(select(iris,-5)),50))
管道符号传递,简洁明了
iris %>%
select(-5) %>%
as.matrix() %>%
head(50) %>%
pheatmap::pheatmap()
玩转条件和循环
条件
if
if(一个逻辑值,不可以是多个逻辑值组成的向量){code }
控制code到底可运行
如果逻辑值是T,就运行
如果是F,就不运行。
if。。。else
if(一个逻辑值,不可以是多个逻辑值组成的向量){code1}
else{code2}
如果逻辑值是FALSE,就执行else里的code
ifelse
支持单个的逻辑值,也支持多个逻辑值组成的向量,根据逻辑值向量生成有两个取值的字符型向量
ifelse() + str_detect()
samples = c("tumor1","tumor2","tumor3","normal1","normal2","normal3")
k1 = str_detect(samples,"tumor");k1
ifelse(k1,"tumor","normal")
#这段逻辑不对,会造成 tumor变成了normal
k2 = str_detect(samples,"normal");k2
ifelse(k2,"normal","tumor")
多个条件
两种写法
1,if。。。else
2, ifelse(,,ifelse)在ifelse里加一个ifelse
补充 case_when
练习题
1.加载deg.Rdata,根据a、b两列的值,按照以下条件生成向量x:
load("deg.Rdata")
#a< -1 且b<0.05,则x对应的值为down;
#a>1 且b<0.05,则x对应的值为up;
#其他情况,x对应的值为no
k1 = deg$a < -1 & deg$b <0.05;table(k1) #table计算重复值
k2 = deg$a > 1 & deg$b <0.05;table(k2)
x = ifelse(k1,"down",ifelse(k2,"up","no"))
table(x)
小李的case when写法
循环
让x里的每个元素i都进行代码操作
i是一个代称
#批量画图
par(mfrow = c(2,2)),把图按照(2,2)的排列方式展示
for(i in 1:4){
plot(iris[,i],col = iris[,5])
}
#批量装包
pks = c("tidyr","dplyr","stringr")
for(g in pks){
if(!require(g,character.only = T))
install.packages(g,ask = F,update = F)
}
玩转隐式循环
apply
向量里有两个东西,一个是正文,一个是名字,虽然是向量,但他的每个 元素可以拥有名字
test<- iris[1:6,1:4] apply(test, 2, mean) Sepal.Length Sepal.Width Petal.Length Petal.Width 4.9500000 3.3833333 1.4500000 0.2333333 apply(test, 1, sum) 1 2 3 4 5 6 10.2 9.5 9.4 9.4 10.2 11.4
思考题:如何挑出30个数里最大的5个
head 取头几个
tail 取尾巴的几个
还没做思考题:如何跳出一个表达矩阵里方差最大的1000个基因
思考题:取出大于1的所有行
向量/列表的隐式循环-lapply
lapply(list, FUN, …)
对列表/向量中的每个元素实施相同的操作
lapply(1:4,rnorm)
两个数据框的链接
merge可以合并
inner_join:交集
都存在的取
inner_join(test1,test2,by="name")
full_join:全连接
full_join(test1,test2,by="name")
left_join:左连接,以左边的为准
left_join(test1,test2,by="name")
right_join:右连接,以右边的为准
right_join(test1,test2,by="name")
表达矩阵画箱线图
当x和y没有名字可以简写表达清楚的时候,不是ggplot2可以接受的类型
1. 这是一个矩阵
2. 先转置
3. 把行名变成一列
4. “宽”变成“长”
把格式变成类似于 ggplot2的形式,一列作为x,一列作为y
5. 再ggplot2
实施
set.seed(10086) #随机种子
exp = matrix(rnorm(18),ncol = 6) #随机18个数,分成6列
exp = round(exp,2) #四舍五入,留下小数点后2位
rownames(exp) = paste0("gene",1:3)
colnames(exp) = paste0("test",1:6)
exp[,1:3] = exp[,1:3]+1 # 1-3列的数字在数值上加1
exp
数据框如下
library(tidyr)
library(tibble)
library(dplyr)
dat = t(exp) %>% # 赋值dat,然后进行转置
as.data.frame() %>% # 矩阵变成数据框
rownames_to_column() %>% #把行名变成一列
mutate(group = rep(c("control","treat"),each = 3)) #新增一列group
宽变长的方法:
pdat = dat%>%
pivot_longer(cols = starts_with("gene"), #要把gene 1,2,3这一行变成列
names_to = "gene",#命名为gene
values_to = "count")#数值用count表示
library(ggplot2)
p = ggplot(pdat,aes(gene,count))+
geom_boxplot(aes(fill = group))+
theme_bw()
p
一些其他函数
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)
重要的函数
多脚本的管理
便于方面管理的文件夹
save(赋值各个文件名,file = "xxxx.Rdata/Rdata")
../ 读取上一级文件夹
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。