- 运行脚本的快捷键:cmd+enter (mac)
- 工作目录是指脚本、数据、图片的默认保存位置,也是文件读取的默认位置。
我们使用project来管理工作目录
开始一个新的R语言数据分析新项目,管理脚本、图片、文件的推荐方式:打开Rstudio,新建Rproject,新建脚本(脚本存放在生成的Rproject文件夹中)。
- 控制台上的提示符不是‘>’而是‘+’时,提示命令不完整,解决办法是将其补齐或者将光标放在控制台最后一行,按ESC退出。
- 逻辑型向量除了TRUE和FALSE,还有NA。
NA和null的区别:
NA表示数据集中的该数据遗失、不存在。在针对具有NA的数据集进行函数操作的时候,NA不会被直接剔除。如x<-c(1,2,3,NA,4),取mean(x),返回结果为NA,如果想去除NA的影响,需要额外设置,如 mean(x,na.rm=T)。NA是没有自己的数据类型(mode/class)的,在vector中,它会“追随”其他数据的类型,比如刚刚的x,mode(x)为numeric,mode(x[4])则也为numeric
NULL表示未知的状态。在运算时不会被计算。如x<-c(1,2,3,NULL,4),取mean(x),结果会返回2.5。NULL是不算数的,length(c(NULL))为0,而length(c(NA))为1。可见NA“占着”位置,它存在着,而NULL没有“占着”位置,或者说“不知道”有没有真正的数据。
- 打开Rproject中的脚本,出现乱码,可以选择file--Reopen with Encoding--UTF8来重新打开。
- paste和paste0的区别:paste/paste0 函数, 用于连接字符(向量),paste 可以设置连接字符,默认以空格作为连接字符;paste0 以空字符串连接字符,不能设置 sep 值。
paste0("gene",1:3)
# [1] "gene1" "gene2" "gene3"
paste("gene",1:3)
# [1] "gene 1" "gene 2" "gene 3" #默认以'空格'分隔
paste("gene",1:3,sep="") #若对paste函数设置sep="",效果和paste0一样
[1] "gene1" "gene2" "gene3"
- R语言的数据类型是存在优先顺序的。其顺序为:
字符型 > 数值型 > 逻辑型
#一个向量中只允许一种数据类型存在
x=c(1,'a',FALSE)
x
# [1] "1" "a" "FALSE"
class(x[1])
# [1] "character"
class(x[3])
# [1] "character"
y=c(1,FALSE)
y
# [1] 1 0
class(y[2])
# [1] "numeric"
若要逆着优先顺序操作,将返回NA
as.numeric('tree')
# [1] NA
# Warning message:
# NAs introduced by coercion
- x==y 和 x %in%y 的区别⚠️
x %in%y是判断x中的每一个元素是否在y中存在。
若x和y长度不一致,返回x个TRUE或者FALSE。
⚠️练习:按如下方式生成test数据框,提取test中,最后一列值为a或c的行,组成一个新的数据框,赋值给test2。
set.seed(33)
test=data.frame(l=rnorm(15),m=sample(1:100,15),n=sample(c('a','b','c'),15,replace = TRUE))
#正解:
test2=test[test$n%in%c('a','c'),]
#错误:
test2=test[test$n==c('a','c'),]
这里如果使用==来判断,就相当于拿test$n的15个值与c('a','c')的2个值来一一对应着比对,因为两者长度不同,会发生循环补齐,其效果如下图,明显不是我们想要的结果。
x%in%y:选出x是y中一个值时的所有行
- x[x %in%y]和intersect(x,y)的区别
x %in%y只查看,不去重。intersect(x,y)则可以去重。
x = c(1,3,5,1,3)
y = c(3,2,5,6,2)
x[x %in% y ]
# [1] 3 5 3
intersect(x,y)
# [1] 3 5
另:取交集、差集、并集的函数为:intersect(x,y)、union(x,y)、setdiff(x,y)、setdiff(y,x)
- 代码不换行,用分号分割,和换行效果一样。
m=1:5;m
# [1] 1 2 3 4 5
- 对单个向量进行的操作中比较重要的几个函数:
length() 、unique(x)、duplicated(x)、table(x)、sort(x) - match函数:向量匹配排序⚠️
y[match(x,y)]:以x作为模板,给y调顺序
x <- c("A","B","C","D","E")
y <- c("B","D","E","A","C")
match(x,y)
# [1] 4 1 5 2 3
y[match(x,y)]
# [1] "A" "B" "C" "D" "E"
x[match(y,x)]
# [1] "B" "D" "E" "A" "C"
a <- data.frame(x,y,z=sample(100,5))
a
# x y z
# 1 A B 88
# 2 B D 15
# 3 C E 87
# 4 D A 28
# 5 E C 84
a[match(a$y,a$x),]
# x y z
# 2 B D 15
# 4 D A 28
# 5 E C 84
# 1 A B 88
# 3 C E 87
match函数的用法参考:https://blog.csdn.net/woodcorpse/article/details/84927296
使用match函数修改矩阵的信息
#生成数据框
a=sample(LETTERS[1:24],7)
b=sample(letters[1:24],7)
c=sample(letters[1:24],7)
gene_name=paste0(a,b,c)
df <- data.frame(file_name=sample(1:7,7,replace = F),gene_name=gene_name)
#生成矩阵
matrix=matrix(sample(1:1000,49),nrow=7)
colnames(matrix)=sample(df$file_name,7,replace = F)
#将矩阵matrix的列名 (file_name) 换成样本名 (gene_name)
colnames(matrix) = df$gene_id[match(colnames(matrix),df$file_name)]
- 列表取子集,使用[]取出的还是列表,是只有一个元素的列表。[[]]取出的才是列表中的元素。
l <- list(m=matrix(1:9, nrow = 3),
df=data.frame(gene = paste0("gene",1:3),
sam = paste0("sample",1:3),
exp = c(32,34,45)),
x=c(1,3,5))
l
# $m
# [,1] [,2] [,3]
# [1,] 1 4 7
# [2,] 2 5 8
# [3,] 3 6 9
# $df
# gene sam exp
# 1 gene1 sample1 32
# 2 gene2 sample2 34
# 3 gene3 sample3 45
# $x
# [1] 1 3 5
l[3]
# $x
# [1] 1 3 5
class(l[3]) #取出的还是列表
# [1] "list"
l[[3]]
# [1] 1 3 5
class(l[[3]]) #取出的是数值型向量
# [1] "numeric"
- 网络问题经常导致github访问不了,可以先在github上下载把code下载下来,再选择install_local()本地安装
devtools::install_local("AnnoProbe-master.zip",upgrade = F)
- 下载R包有3种方法,CRAN,bioconductor和github。其中CRAN和bioconductor是可以设置镜像的。
方法1--设置CRAN镜像:打开R studio,点击tools--global option--packages,选择Package CRAN reposotory。
方法2--设置CRAN和bioconductor镜像
options("repos"=c(CRAN="http://mirrors.tun a.tsinghua.edu.cn/CRAN/"))
options(BioC_mirror="http://mirrors.ustc.e du.cn/bioc/")
- 加载R包除了library()函数还有require()函数
如果安装了某个包,require()就会返回TRUE,并加载R包。没安装就会返回FALSE
if(!require(stringr))install.packages("stringr")
#意思是如果‘stringr’包没有安装,就安装‘stringr’包。
if(TRUE) #后面的代码被运行
if(FALSE) #后面的代码被跳过
- 查看R包的在线教程帮助文档:
browseVignettes()
函数(browseVignettes不是每个包都有)
browseVignettes("stringr")
- 查看某个R包中有哪些函数
# 以dplyr包为例
library(dplyr)
ls('package:dplyr')
- R语言能读取的文件格式
用于读取/导出文件的R包
rio可以不用区分读入文件类型,大部分文件可直接用import()读取。
- @和$的区别
x$y 等价于 x[["y", exact = FALSE]],用于获取dataframe或者list里面的某个变量,比如mtcars$cyl 和 diamonds$carat。不同之处在于$可以部分匹配变量名,比如:
x <- list(abc = 1)
x$a
#> [1] 1
x[["a"]]
#> NULL
@ 是R中,S4类的一个操作符,用于提取S4对象中的内容(slot),比如:
setClass("Person",slots = list(name = "character", age = "numeric"))
alice <- new("Person", name = "Alice", age = 40)
alice@age
# [1] 40
这个时候$是不起作用的,因为被S4类重写了。可以自己定义$的行为。
⚠️:matrix不能直接用$取列
- length()和str_length()
y <- c('aaa','fhuv','dvh')
length(y)
# [1] 3
str_length(y)
# [1] 3 4 3
- tidyr包可以实现仅按照某一列来去除缺失值、缺失值替换(replace_na函数)
- 长脚本管理方式
- 分成多个脚本,每个脚本最后保存Rdata,下一个脚本开头清空再加载。
- if(F){...} ,则{ }里的脚本被跳过 if(T){...} ,则{ }里的脚本被运行 凡是带有{ }的代码,均可以被折叠。
- data.frame里取1行生成的是只有1行的数据框,但取1列生成的是向量。
df <- data.frame(x=1:5,y=letters[3:7],z=rnorm(5))
class(df[2,])
# [1] "data.frame"
class(df[,2])
# [1] "character"
class(df[2]) #取单列但想生成数据框,不加逗号即可(不设置取行还是取列默认取列)
# [1] "data.frame"
⚠️因此如果想取数据框中的部分行,在方括号中直接输入行数即可,返回的仍然是数据框。但如果加了逗号,会丧失数据框的格式,也就是会使数据框的行名(往往是基因名)丢失。
- 复制别的文件夹的文件到当前目录
a = dir("../pipeline/",pattern = "R$")[2:6] #提取需要复制的文件,dir()显示某个目录下有哪些文件,pattern = "R$"是显示以.R结尾的文件(代码)。
for (i in a) {
file.copy(paste0("../pipeline/",i),"./") # file.copy():复制文件
}
- 保存图片时图片命名小技巧
在前面把实验project(如GSE编号)单独生成并保存,比如:
gse_number = "GSE56649" #要研究的GSE编号
后面存图时可以用paste0连接GSE编号和图片类型及后缀,这样不同数据的分析得到的图片名就跟数据相一致。
ggsave(plot = pca_plot,filename = paste0(gse_number,"_PCA.png"))
save(pca_plot,file = "pca_plot.Rdata")
- R语言4.0版本以上默认 options(stringsAsFactors = F)
- factor()函数可以把有重复值的向量变成因子
factor()自动生成的levels默认按字母顺序排列,所以在设置的时候,最好直接指定levels。
#设置参考水平,指定levels,对照组在前,处理组在后,不能反
Group = factor(Group,
levels = c("control","patient"))
- R语言的S3和S4对象
参考:https://www.jianshu.com/p/8f605946f0b9 - read.table(), read.csv(), import()这些函数都支持直接读取压缩了的文件,不需解压。
dat = read.table("counts.tsv.gz",check.names = F,row.names = 1,header = T)
- R语言中的波浪号(~):用来连接公式中的响应变量(波浪号左边)和自变量(波浪号右边)。更多说明可查看help("~")
- dir("路径")函数,返回该路径下的所有文件/文件夹的名称(不包含文件夹中的子文件/文件夹)。
dir()函数有一个参数recursive,默认为F。当设置recursive=T
时,会列出该目录下所有文件,包括文件夹中的文件。 -
do.call()
函数--将list扁平化
R语言有类型丰富的数据结构,很多时候数据结构比较复杂,需要使用list数据结构。但是list对象很难以文本的形式导出,因此需要一个函数快速将复杂的list结构扁平化成dataframe。使用do.call函数可以进行这个操作。简单的讲,do.call函数的功能就是执行一个函数,而这个函数的对象是list的每个子元素。
- 用法:
do.call(what, args, quote = FALSE, envir = parent.frame())
- 参数:
参数 | 含义 |
---|---|
what | either a function or a non-empty character string naming the function to be called. 也就是想要对list执行的函数 |
args | a list of arguments to the function call. The names attribute of args gives the argument names. 想要操作的list |
quote | a logical value indicating whether to quote the arguments. |
envir | an environment within which to evaluate the call. This will be most useful if what is a character string and the arguments are symbols or quoted expressions. |
clinical <- do.call(rbind,cl) #把cl列表中的每一个元素(数据框)按行合并
- 取整数:向上取整和向下取整。
as.integer()取整数是直接去掉小数位,保留整数,而不会进行四舍五入。
跟as.integer()对应的是ceiling(),是向上取整。
as.integer(1.1)
# [1] 1
as.integer(1.9)
# [1] 1
ceiling(1.1)
# [1] 2
ceiling(1.9)
# [1] 2
- with函数
# 差异表达矩阵DEG取cutoff值判断基因是上调还是下调时:
logFC_cutoff <- DEG$mean(abs(log2FoldChange)) + 2*sd(DEG$log2FoldChange) )
# 如果不想每次都写DEG,就可以使用with函数,将DEG写在with函数的第一个参数,DEG的列名就可以直接作为变量来用。
logFC_cutoff <- with(DEG,mean(abs(log2FoldChange)) + 2*sd(abs(log2FoldChange)) )
- 将表达矩阵中的字符串转换成数字(apply函数)
class(exp[1,1])
# [1] "character"
exp=apply(exp,2,as.numeric)
class(exp[1,1])
# [1] "numeric"
- round函数:保留小数点后几位
round(0.34524)
# [1] 0
round(0.34524,2)
[1] 0.35
round(0.34524,4)
# [1] 0.3452
- 若有文件较大,可以按如下方式写代码。运行后保存,再次运行如果有这个文件存在则不再运行(存在即跳过)
tmp_rf="TCGA_KIRC_miRNA_rf_output.Rdata"
if(!file.exists(tmp_rf)){
rf_output=randomForest(x=x, y=y,importance = TRUE, ntree = 10001, proximity=TRUE )
save(rf_output,file = tmp_rf)
}
load(file = tmp_rf)
- ggplot2改变柱状图的顺序(其它图改横轴顺序也是这个思路)
ggplot2画图时默认是按字母排列顺序来对样本进行绘制,但这有时并不符合实际情况。这时就需要进行调整。
library(ggplot2)
library(ggthemes)
dt = data.frame(obj = c('D','B','C','A','E'), val = c(2,15,6,9,7))
ggplot(dt, aes(x = obj, y = val, fill = obj, group = factor(1))) +
geom_bar(stat = "identity", width = 0.5)
横轴还是按字母排序的,不是按我们想要的顺序
通过将变量因子化来设置柱条的顺序
dt$obj = factor(dt$obj, levels=c('D','B','C','A','E'))
ggplot(dt, aes(x = obj, y = val, fill = obj, group = factor(1))) +
geom_bar(stat = "identity", width = 0.5)
- 将稀疏矩阵转为普通矩阵直接用
as.matrix
就可以
m1 <- as.matrix(sM)
##具体可以查看methods
grep("as.matrix", methods(class = "sparseMatrix"), value = TRUE)
#[1] "as.matrix,Matrix-method"
网友评论