R语言细节汇总

  1. 运行脚本的快捷键:cmd+enter (mac)
  2. 工作目录是指脚本、数据、图片的默认保存位置,也是文件读取的默认位置。
    我们使用project来管理工作目录

开始一个新的R语言数据分析新项目,管理脚本、图片、文件的推荐方式:打开Rstudio,新建Rproject,新建脚本(脚本存放在生成的Rproject文件夹中)。

  1. 控制台上的提示符不是‘>’而是‘+’时,提示命令不完整,解决办法是将其补齐或者将光标放在控制台最后一行,按ESC退出。
  2. 逻辑型向量除了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没有“占着”位置,或者说“不知道”有没有真正的数据。

  1. 打开Rproject中的脚本,出现乱码,可以选择file--Reopen with Encoding--UTF8来重新打开。
  2. 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"
  1. 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 
  1. 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中一个值时的所有行

  1. 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)

  1. 代码不换行,用分号分割,和换行效果一样。
m=1:5;m
# [1] 1 2 3 4 5
  1. 对单个向量进行的操作中比较重要的几个函数:
    length() 、unique(x)、duplicated(x)、table(x)、sort(x)
  2. 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)]
  1. 列表取子集,使用[]取出的还是列表,是只有一个元素的列表。[[]]取出的才是列表中的元素。
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"
  1. 网络问题经常导致github访问不了,可以先在github上下载把code下载下来,再选择install_local()本地安装
devtools::install_local("AnnoProbe-master.zip",upgrade = F)
  1. 下载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/")
  1. 加载R包除了library()函数还有require()函数
    如果安装了某个包,require()就会返回TRUE,并加载R包。没安装就会返回FALSE
if(!require(stringr))install.packages("stringr")
#意思是如果‘stringr’包没有安装,就安装‘stringr’包。
if(TRUE) #后面的代码被运行
if(FALSE) #后面的代码被跳过
  1. 查看R包的在线教程帮助文档:browseVignettes()函数(browseVignettes不是每个包都有)
browseVignettes("stringr")
  1. 查看某个R包中有哪些函数
# 以dplyr包为例
library(dplyr)
ls('package:dplyr')
  1. R语言能读取的文件格式

用于读取/导出文件的R包

rio可以不用区分读入文件类型,大部分文件可直接用import()读取。

  1. @和$的区别
    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不能直接用$取列

  1. length()和str_length()
y <- c('aaa','fhuv','dvh')
length(y)
# [1] 3
str_length(y)
# [1] 3 4 3
  1. tidyr包可以实现仅按照某一列来去除缺失值、缺失值替换(replace_na函数)
  2. 长脚本管理方式
  • 分成多个脚本,每个脚本最后保存Rdata,下一个脚本开头清空再加载。
  • if(F){...} ,则{ }里的脚本被跳过 if(T){...} ,则{ }里的脚本被运行 凡是带有{ }的代码,均可以被折叠。
  1. 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"

⚠️因此如果想取数据框中的部分行,在方括号中直接输入行数即可,返回的仍然是数据框。但如果加了逗号,会丧失数据框的格式,也就是会使数据框的行名(往往是基因名)丢失。

  1. 复制别的文件夹的文件到当前目录
a = dir("../pipeline/",pattern = "R$")[2:6] #提取需要复制的文件,dir()显示某个目录下有哪些文件,pattern = "R$"是显示以.R结尾的文件(代码)。
for (i in a) {
  file.copy(paste0("../pipeline/",i),"./") # file.copy():复制文件
}
  1. 保存图片时图片命名小技巧
    在前面把实验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")
  1. R语言4.0版本以上默认 options(stringsAsFactors = F)
  2. factor()函数可以把有重复值的向量变成因子
    factor()自动生成的levels默认按字母顺序排列,所以在设置的时候,最好直接指定levels。
#设置参考水平,指定levels,对照组在前,处理组在后,不能反
Group = factor(Group,
               levels = c("control","patient"))
  1. R语言的S3和S4对象
    参考:https://www.jianshu.com/p/8f605946f0b9
  2. read.table(), read.csv(), import()这些函数都支持直接读取压缩了的文件,不需解压。
dat = read.table("counts.tsv.gz",check.names = F,row.names = 1,header = T)
  1. R语言中的波浪号(~):用来连接公式中的响应变量(波浪号左边)和自变量(波浪号右边)。更多说明可查看help("~")
  2. dir("路径")函数,返回该路径下的所有文件/文件夹的名称(不包含文件夹中的子文件/文件夹)。
    dir()函数有一个参数recursive,默认为F。当设置recursive=T时,会列出该目录下所有文件,包括文件夹中的文件。
  3. 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列表中的每一个元素(数据框)按行合并
  1. 取整数:向上取整和向下取整。
    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
  1. 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)) )
  1. 将表达矩阵中的字符串转换成数字(apply函数)
class(exp[1,1])
# [1] "character"
exp=apply(exp,2,as.numeric)
class(exp[1,1])
# [1] "numeric"
  1. round函数:保留小数点后几位
round(0.34524)
# [1] 0
round(0.34524,2)
[1] 0.35
round(0.34524,4)
# [1] 0.3452
  1. 若有文件较大,可以按如下方式写代码。运行后保存,再次运行如果有这个文件存在则不再运行(存在即跳过)
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)
  1. 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)
  1. 将稀疏矩阵转为普通矩阵直接用as.matrix就可以
m1 <- as.matrix(sM) 
##具体可以查看methods
grep("as.matrix", methods(class = "sparseMatrix"), value = TRUE) 
#[1] "as.matrix,Matrix-method" 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • %>%是管道符的意思,把左边的输出(不包括 <-之前的)当成右边的输入。 怎么分辨是列表,还是向量,还是数组,还是...
    伏愫阅读 1,874评论 0 20
  • http://blog.sina.com.cn/s/blog_6bc5205e0102vma9.html inst...
    付德刚Q阅读 3,044评论 0 3
  • 本文是对R语言一个学习总结,共包括如下章节内容: 什么是R语言 开发环境搭建 基本语法 向量 列表和矩阵 读写数据...
    我是老薛阅读 1,862评论 0 1
  • 一. R与Rstudio R: 编程语言,统计计算和绘图的环境。 R studio: R语言的集成开发环境 新建项...
    Hannahhao阅读 339评论 0 0
  • R语言与数据挖掘:公式;数据;方法 R语言特征 对大小写敏感 通常,数字,字母,. 和 _都是允许的(在一些国家还...
    __一蓑烟雨__阅读 1,634评论 0 5