打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
R语言细节汇总
userphoto

2023.01.26 辽宁

关注
运行脚本的快捷键: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 0class(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 3intersect(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 3y[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 84a[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 5l[3]# $x# [1] 1 3 5class(l[3]) #取出的还是列表# [1] "list" l[[3]]# [1] 1 3 5class(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] 1x[["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] 3str_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())
参数:
参数含义
whateither a function or a non-empty character string naming the function to be called. 也就是想要对list执行的函数
argsa list of arguments to the function call. The names attribute of args gives the argument names. 想要操作的list
quotea logical value indicating whether to quote the arguments.
enviran 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] 1as.integer(1.9)# [1] 1ceiling(1.1)# [1] 2ceiling(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] 0round(0.34524,2)[1] 0.35round(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) ##具体可以查看methodsgrep("as.matrix", methods(class = "sparseMatrix"), value = TRUE) #[1] "as.matrix,Matrix-method"
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
R语言初学手册
R语言基础编程技巧汇编
从表达量矩阵求各处理组的平均值
R学习 从Tidyverse学起,入门R语言(tidyr和stringr)
R语言基础知识——子集的提取(2)
R Study Note 2
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服