全文并非是对数据整理的实操整理,主要整理在数据整理/清洗中常用的R包介绍
library(tidyr)
library(dplyr)
library(stringr)
library(tibble)
x <- "The birch canoe slid on the smooth planks."
x
str_length(x)
# 引号内的单个字母/数字/符号数量
length(x)
#检测向量内的元素数
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列
#提取x中第5和第9位的字符串
str_sub(x,5,9)
str_detect(x2,"h")
# 第一个参数为向量名,第二个是检测的关键词
str_starts(x2,"T")
#判断x2中T开头的字符串,输出逻辑向量
str_ends(x2,"e")
#判断x2中e结尾的字符串,输出逻辑向量
x2
str_replace(x2,"o","A")
#每个元素里面只替换第一次出现的目标字符
str_replace_all(x2,"o","A") #替换元素中所有目标字符
x
str_remove(x," ") #只删除第一次出现的目标字符
str_remove_all(x," ") #删除全部目标字符
library(dplyr)
arrange(test, Sepal.Length) #从小到大排序
arrange(test, desc(Sepal.Length)) #从大到小排序
distinct(test,Species,.keep_all = T)
#".keep_all = T"为必须要写的参数
test <- mutate(test, new = Sepal.Length * Sepal.Width)
#R中的修改必须要赋值,不赋值=没发生
test
x1 = select(iris,-5) #"-5"为删除第5列
x2 = as.matrix(x1)
x3 = head(x2,50) #head()为取前xx行
pheatmap::pheatmap(x3)
筛选列的函数select()
筛选行的函数filter()
pheatmap::pheatmap(head(as.matrix(select(iris,-5)),50))
# 从最里面的()向外一层层读
iris %>%
select(-5) %>%
as.matrix() %>%
head(50) %>%
pheatmap::pheatmap()
i = -1
if (i<0) print('up') #if()只能有一个逻辑值
if (i>0) print('up')
i =1
if (i>0){
print('+')
} else {
print("-")
}
i = 1
ifelse(i>0,"+","-")
# ifelse(<判定条件>,<符合输出>,<不符合输出>)
x = rnorm(3)
x
ifelse(x>0,"+","-")
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")
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")
★★★★★长脚本的管理方式★★★★★
# 示例一:
for( i in 1:4){
print(i)
}
# 示例二:
for ( i in 1:3000) {
paste0("I love U ", i, " times") |> print()
}
par(mfrow = c(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()
族函数#apply(X, MARGIN, FUN, …)
# 其中X是数据框/矩阵名;
### MARGIN为1表示行,为2表示列,FUN是函数 ###
test<- iris[1:6,1:4]
apply(test, 2, mean)
apply(test, 1, sum)
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)
lapply(list, FUN, …)
函数--参数与自定义函数相似lapply(1:4,rnorm)
lapply(1:4, function(i){
plot(iris[,i],col = iris[,5])
})
pks = c("tidyr","dplyr","stringr")
qa = function(g){
if(!require(g,character.only = T))
install.packages(g,ask = F,update = F)
}
lapply(pks, qa)
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") #反连接 基本不用
step1 对matrix进行转置:使gene名变为列名,将样本名转化为data.frame中的第一列
ggplot2对行名并不友好,通常要使样本名转化为data.frame中的第一列,防止在后续代码运行过程中行名丢失
step2 把原来的行名转变为第一列
step3 宽变长 :test、gene、count数均在一行上(将上图的宽数据变为长数据)
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
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")
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的标度在每个版面都可以变化###
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
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 删除。