前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Day07 生信马拉松-数据整理中的R

Day07 生信马拉松-数据整理中的R

原创
作者头像
大冬仔
修改2023-08-19 14:31:24
2170
修改2023-08-19 14:31:24
举报
文章被收录于专栏:生信学习Marathon

全文并非是对数据整理的实操整理,主要整理在数据整理/清洗中常用的R包介绍

代码语言:javascript
复制
library(tidyr)
library(dplyr)
library(stringr)
library(tibble)

1.玩转字符串--stringr包

1.1 字符串长度-引号内的单个字母/数字/符号数量

代码语言:javascript
复制
x <- "The birch canoe slid on the smooth planks."
x
str_length(x)
# 引号内的单个字母/数字/符号数量
length(x) 
#检测向量内的元素数

1.2 字符串拆分

代码语言:javascript
复制
str_split(x," ") #直接拆分后会变成list的子集
class(str_split(x," "))
x2 = str_split(x," ")[[1]];x2
 #向量长度仅为1,因此用[[1]] x2为字符型向量 
 #######################################
y = c("jimmy 150","nicker 140","tony 152")
str_split(y," ")
str_split(y," ",simplify = T) 
#"simplify"参数默认拆分取为matrix
str_split(y," ",simplify = T) [,1]
#只拆分提取第1列

1.3 按位置提取字符串

代码语言:javascript
复制
#提取x中第5和第9位的字符串
str_sub(x,5,9)

1.4 字符检测

代码语言:javascript
复制
str_detect(x2,"h")
# 第一个参数为向量名,第二个是检测的关键词
str_starts(x2,"T")
 #判断x2中T开头的字符串,输出逻辑向量
str_ends(x2,"e")
#判断x2中e结尾的字符串,输出逻辑向量

1.5 字符串替换

代码语言:javascript
复制
x2
str_replace(x2,"o","A")
 #每个元素里面只替换第一次出现的目标字符
str_replace_all(x2,"o","A") #替换元素中所有目标字符

1.6 字符删除

代码语言:javascript
复制
x
str_remove(x," ") #只删除第一次出现的目标字符
str_remove_all(x," ") #删除全部目标字符

2.玩转data.frame--dplyr包

2.1 arrange,数据框按照某一列排序,实际参数不能加" "

代码语言:javascript
复制
library(dplyr)
arrange(test, Sepal.Length)  #从小到大排序
arrange(test, desc(Sepal.Length))  #从大到小排序

2.2 distinct,数据框按照某一列去重复

代码语言:javascript
复制
distinct(test,Species,.keep_all = T) 
#".keep_all = T"为必须要写的参数

2.3 mutate,数据框新增一列

代码语言:javascript
复制
test <- mutate(test, new = Sepal.Length * Sepal.Width) 
#R中的修改必须要赋值,不赋值=没发生
test 

2.4 连续步骤的不同方法

2.4.1 多次赋值,产生多个中间的变量
代码语言:javascript
复制
x1 = select(iris,-5) #"-5"为删除第5列
x2 = as.matrix(x1)
x3 = head(x2,50) #head()为取前xx行
pheatmap::pheatmap(x3)

筛选列的函数select()

筛选行的函数filter()

2.4.2 多重嵌套,代码不易读
代码语言:javascript
复制
pheatmap::pheatmap(head(as.matrix(select(iris,-5)),50))
# 从最里面的()向外一层层读
2.4.3 管道符号传递,简洁明了--最优选择
代码语言:javascript
复制
iris %>%
  select(-5) %>%
  as.matrix() %>%
  head(50) %>% 
  pheatmap::pheatmap()

3.条件和循环

3.1 if(){ }

3.1.1 只有if没有else,那么条件是FALSE时就什么都不做
代码语言:javascript
复制
i = -1
if (i<0) print('up') #if()只能有一个逻辑值
if (i>0) print('up')
3.1.2 有else
代码语言:javascript
复制
i =1
if (i>0){
  print('+')
} else {
  print("-")
}
i = 1
ifelse(i>0,"+","-")

# ifelse(<判定条件>,<符合输出>,<不符合输出>)
x = rnorm(3)
x
ifelse(x>0,"+","-")
★★★★★ifelse()+str_detect(),条件筛选的王炸组合★★★★★
代码语言:javascript
复制
samples = c("tumor1","tumor2","tumor3","normal1","normal2","normal3")
k1 = str_detect(samples,"tumor");k1
ifelse(k1,"tumor","normal")
k2 = str_detect(samples,"normal");k2
ifelse(k2,"normal","tumor")
3.1.3 多个条件
代码语言:javascript
复制
i = 0
if (i>0){
  print('+')
} else if (i==0) {
  print('0')
} else if (i< 0){
  print('-')
}

#简洁嵌套写法
ifelse(i>0,"+",ifelse(i<0,"-","0"))

####case_when函数的应用--优先选择!!###
library(dplyr)
i = rnorm(10)
case_when(i>0 ~ "+",
          i<0 ~ "-",
          T ~ "0")

★★★★★长脚本的管理方式★★★★★

方法一
方法一
例如下载数据的代码,保留但不反复运行,if()换为T则运行
例如下载数据的代码,保留但不反复运行,if()换为T则运行
方法二
方法二

3.2 for循环--直接看代码理解

代码语言:javascript
复制
# 示例一:
for( i in 1:4){
  print(i)
}

# 示例二:
for ( i in 1:3000) {
  paste0("I love U ", i, " times") |> print()
}
3.2.1 批量画图
代码语言:javascript
复制
par(mfrow = c(2,2))
for(i in 1:4){
  plot(iris[,i],col = iris[,5])
}
3.2.2 批量装包--更换设备必用代码
代码语言:javascript
复制
pks = c("tidyr","dplyr","stringr")
for(g in pks){
  if(!require(g,character.only = T))
    install.packages(g,ask = F,update = F)
}

4.隐式循环

4.1 apply()族函数

4.1.1 apply 处理矩阵或数据框
代码语言:javascript
复制
#apply(X, MARGIN, FUN, …) 
# 其中X是数据框/矩阵名;
### MARGIN为1表示行,为2表示列,FUN是函数 ###

test<- iris[1:6,1:4]

apply(test, 2, mean)
apply(test, 1, sum)
4.1.2 批量画图
代码语言:javascript
复制
par(mfrow = c(2,2))
apply(iris[,1:4], 2, plot)
# 如果有写不下的参数,继续写在apply的括号里
apply(iris[,1:4], 2, plot,col = iris[,5])
# 或者也可以自定义函数
jimmy <- function(g){
  plot(g,col = iris[,5])
}
par(mfrow = c(2,2))
apply(iris[,1:4], 2, jimmy)

4.2 lapply(list, FUN, …)函数--参数与自定义函数相似

4.2.1 对列表/向量中的每个元素实施相同的操作
代码语言:javascript
复制
lapply(1:4,rnorm)
4.2.2 批量画图
代码语言:javascript
复制
lapply(1:4, function(i){
  plot(iris[,i],col = iris[,5])
})
4.2.3 批量装包
代码语言:javascript
复制
pks = c("tidyr","dplyr","stringr")
qa = function(g){
  if(!require(g,character.only = T))
    install.packages(g,ask = F,update = F)
}
lapply(pks, qa)

5.两个data.frame的连接

代码语言:javascript
复制
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")
#半连接 基本不用 近似于 %in%
anti_join(test1,test2,by="name") #反连接 基本不用

6.表达矩阵画箱线图

6.1操作过程图示

step1 对matrix进行转置:使gene名变为列名,将样本名转化为data.frame中的第一列

ggplot2对行名并不友好,通常要使样本名转化为data.frame中的第一列,防止在后续代码运行过程中行名丢失

转置前数据格式图
转置前数据格式图
转置后数据格式图
转置后数据格式图

step2 把原来的行名转变为第一列

step3 宽变长 :test、gene、count数均在一行上(将上图的宽数据变为长数据)

转变后的长数据
转变后的长数据

6.2实操代码

6.2.1 如何生成一个matrix
代码语言:javascript
复制
set.seed(10086) #设置种子数使随机生成的数固定
exp = matrix(rnorm(18),ncol = 6) #新建一个matrix
exp = round(exp,2) #round()函数为四舍五入,此处参数“2”为取两位小数,不做设置默认取整数
rownames(exp) = paste0("gene",1:3) #设置行名
colnames(exp) = paste0("test",1:6) #设置列名
exp[,1:3] = exp[,1:3]+1
exp
6.2.2 数据整理
代码语言:javascript
复制
library(tidyr)
library(tibble)
library(dplyr) #加载数据整理需要的包
dat = t(exp) %>%  #将matrix进行行列转置
  as.data.frame() %>% #将matrix转为data.frame
  rownames_to_column() %>%  #将行名转化为1列
  mutate(group = rep(c("control","treat"),each = 3)) #对data.frame新增一列分组信息
# 宽变长操作
pdat = dat%>% 
  pivot_longer(cols = starts_with("gene"), 
  # pivot_longer()为宽变长的函数,starts_with("gene")内为需要宽长转换的列名
               names_to = "gene",
               values_to = "count")
6.2.3 作图
代码语言:javascript
复制
library(ggplot2)
p = ggplot(pdat,aes(gene,count))+ # 将x,y省略
  geom_boxplot(aes(fill = group))+ 
  theme_bw()
p
p + facet_wrap(~gene,scales = "free") # 分面  scales = "free" 
###scales = “free”    x和y的标度在每个版面都可以变化###

ggplot2 分面相关设置(facet)详解

7.一些实操中的便捷函数

7.1 match() 函数

代码语言:javascript
复制
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

7.2 一些搞文件的函数

代码语言:javascript
复制
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)

以上内容均引用自生信技能树

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.玩转字符串--stringr包
    • 1.1 字符串长度-引号内的单个字母/数字/符号数量
      • 1.2 字符串拆分
        • 1.3 按位置提取字符串
          • 1.4 字符检测
            • 1.5 字符串替换
              • 1.6 字符删除
              • 2.玩转data.frame--dplyr包
                • 2.1 arrange,数据框按照某一列排序,实际参数不能加" "
                  • 2.2 distinct,数据框按照某一列去重复
                    • 2.3 mutate,数据框新增一列
                      • 2.4 连续步骤的不同方法
                        • 2.4.1 多次赋值,产生多个中间的变量
                        • 2.4.2 多重嵌套,代码不易读
                        • 2.4.3 管道符号传递,简洁明了--最优选择
                    • 3.条件和循环
                      • 3.1 if(){ }
                        • 3.1.1 只有if没有else,那么条件是FALSE时就什么都不做
                        • 3.1.2 有else
                        • ★★★★★ifelse()+str_detect(),条件筛选的王炸组合★★★★★
                        • 3.1.3 多个条件
                      • 3.2 for循环--直接看代码理解
                        • 3.2.1 批量画图
                        • 3.2.2 批量装包--更换设备必用代码
                    • 4.隐式循环
                      • 4.1 apply()族函数
                        • 4.1.1 apply 处理矩阵或数据框
                        • 4.1.2 批量画图
                      • 4.2 lapply(list, FUN, …)函数--参数与自定义函数相似
                        • 4.2.1 对列表/向量中的每个元素实施相同的操作
                        • 4.2.2 批量画图
                        • 4.2.3 批量装包
                    • 5.两个data.frame的连接
                    • 6.表达矩阵画箱线图
                      • 6.1操作过程图示
                        • 6.2实操代码
                          • 6.2.1 如何生成一个matrix
                          • 6.2.2 数据整理
                          • 6.2.3 作图
                      • 7.一些实操中的便捷函数
                        • 7.1 match() 函数
                          • 7.2 一些搞文件的函数
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档