写在前面:公众号又被我搁置好久,闲来无事,写写近期学的R语言吧,主要分为两个部分写,一主要为数据处理,二为ggplot作图。这两个部分将生信分析的绝大多数常用命令都讲到了,作为R语言入门是够用的,但是学海无涯,以此只是作为一个引子,想要进步还是要自己多学多练,举一反三才行。
air.hole <- c(10,12.5,12.5,12.5,……)
#产生向量,将(10,12.5,12.5,12.5,……)中的值赋予到air.hole
length(air.hole)
repeats <- rep(seq(1, 5),times = 3)
chemical <- rep(c("KNO3", "NaNO3", "H2O"), each=5)
#seq() 产生一个向量序列;rep() 重复一个对象
#rep(x,times):x是要重复的对象(例如向量c(1,2,3)),times为对象中每个元素重复的次数(如times=c(9,7,3)就是将x向量的1重复9次,2重复7次,3重复3次)
#rep(x,times)重复x,times次;使用each=来重复x元素each次;rep(c(1,2,3),2)得到1 2 3 1 2 3;rep(c(1,2,3),each=2)得到1 1 2 2 3 3
b1 = rbind(air.hole, repeats, chemical)
#rbind 将()内矩阵横着拼接显示;cbind将()内矩阵竖着拼接显示
a1 = data.frame(air.hole, repeats, chemical)
#组合成数据框
a1.1 = a1[a1$chemical=="H2O", ]
#形象的说:a1就是打开a1这个文件,a1$chemical就是定位到chemiacal==“H2O”这个位置;","就是显示显示所有符合的行
mean(a1.1$air.hole)
#求均值
b1=aggregate(a1air.hole, list(a1chemical), mean)
#aggregate(需要被计算的内容,分类项,计算函数)
aggregate(air.hole~chemical, data=b1, mean)
#aggregate(因变量~自变量,数据,计算函数)
colnames(b1) = c("chemical", "mean")
rownames(b1)=c(“a”,“b”,“c”)
#colnames():更改列标题
#rownames():更改行标题
setwd("C:/Users/CAN/Desktop/R")
#设置工作目录
getwd()
#显示当前工作目录
dir()
#显示目录内容
a1 = read.csv("R11.csv", sep = ",", header = T)
#读取R11.csv文件,header = T表示将数据的第一行作为标题
a2 = read.table("R11.txt", sep = "\t", header = T)
#读取R11.txt文件,header = T表示将数据的第一行作为标题
read.csv(file=file.choose(),header=T)
#跳出选择文件的对话框,选择文件后自动打开
head(a1)
#显示数据前6行
tail(a1)
#显示数据后6行
dim(a1)
#变量维度(几行几列)
str(a1)
#以简洁的方式显示对象的数据结构及内容
summary(a1)
#可以提供最小值、最大值、四分位数和数值型变量的均值,以及因子向量和逻辑型向量的频数统计
table(a1$chemical)
table(a1$chemical, useNA = "ifany")
#求因子出现的频数;table()函数默认忽略缺失值(NA),要在频数统计中将NA视为一个有效的类别,请设定参数 useNA=“ifany”
x = xtabs(air.hole ~ chemical + repeats, data = a1)
#xtabs(forula,data)根据一个公式和一个矩阵或数据框创建一个N维列联表;
#波浪号(~):用来连接公式中的响因变量(波浪号左边)和自变量(波浪号右边)
ftable(x)
#ftable(table):创建一个紧凑的”平铺“式列联表
object.size(x)
print(object.size(x), units = "Kb")
#显示文件大小
a1[1,] #显示a1第一行数据
a1[,3] #显示a1第三列数据(横着显示)
a1[3] #显示a1第三列数据(竖着显示)
a1[2,3] #显示a1第二行第三列的数据
a2 = a1[,1:3] #显示a1第一列到第三列内容
e = t(a1) #t(x)转置
f = as.data.frame(a1) #对象类型转变为数据框
mode(f)
#查看对象x的模式:空(NULL),数值(numeric),字符(character),逻辑(logical),复数(complex),列表(list),函数(function)
class(f)
#查看对象x的类型:除了mode里列出的几种类型外,还有整数(integer),矩阵(matrix),因子(factor),阵列(array),数据框(data frame),时间序列(ts) 等其他类型。mode主要用于区别数据存放的方式,而class是一种更细微的分类方式,比如矩阵,就是一种更“有序”的数据存放方式。此命令比mode常用。
write.table(f, "R11.txt", sep = "\t", row.names = FALSE)
write.csv(f, "R11.csv", row.names = F)
#将f的内容写入R11中;row.names=F 表示不把行名称读进去;sep="\t" 表示以tab(制表符\t)为分隔符
remove(list = ls())
#清除全部对象,即用ls()列出全部对象名,用一个list将全部对象装进里面,rm()全部清除
#去重复
a.distinct = dplyr::distinct(a1, Species)
#将species这一列中所有项均显示一遍(只显示这一列),重复的只显示第一个
a2 = a1[!duplicated(a1$Species), ]
#删除species这一列的重复项,默认保留第一次出现的
!duplicated(a1$Species)
#duplicated函数是一个可以用来解决向量或者数据框重复值的函数,它会返回一个TRUE或FALSE的向量,以标注该索引所对应的值是否是前面数据所重复的值。
#数据排序
a2[order(a2$Sepal.Length), ]
dplyr::arrange(a2, Sepal.Length)
#对a2数据中Sepal.Length升序排序
a2[order(a2$Sepal.Length, decreasing = T), ]
dplyr::arrange(a2, desc(Sepal.Length))
#对a2数据中Sepal.Length降序排序
a2[order(a2Sepal.Length, a2Sepal.Width), ]
dplyr::arrange(a2, Sepal.Length, Sepal.Width)
#对a2数据中Sepal.Length升序排序,若相同,则按照Sepal.Width升序排序
dplyr::arrange(a2, Sepal.Length, desc(Petal.Length))
#对a2数据中Sepal.Length升序排序,若相同,则按照Sepal.Width降序排序
#数据筛选
a2[ a2$Sepal.Length >= 7, ]
subset(a2, Sepal.Length >=7)
dplyr::filter(a2, Sepal.Length >=7)
#筛选a2数据中所有符合Sepal.Length >=7的行
a2.2 =subset(a1, Species == "setosa" & Sepal.Length > 5.5)
a2.2 = dplyr::filter(a1, Species == "setosa" & Sepal.Length > 5.5)
#筛选a1数据中所有符合Species == "setosa”和Sepal.Length > 5.5的行
d= dplyr::filter(a1, (Species == "setosa" | Species == "versicolor")
& Petal.Length>1.5)
#筛选a1数据中所有符合Species == "setosa" 、 Species == "versicolor"和Petal.Length>1.5的行
#数据特定列的选择
a2.2[, c("Species", "Sepal.Length", "Sepal.Width")]
a2.2[,c(5,1,2)]
dplyr::select(a2.2, 5, 1:2)
dplyr::select(a2.2, Species, Sepal.Width, Sepal.Length)
#筛选a2.2数据中标题为"Species", "Sepal.Length", "Sepal.Width"的列,数字为列数
#数据列的选择
dplyr::select(a2.2, Species, contains("Sepal"))
#筛选a2.2数据中标题包括"Sepal"、标题为"Species"的列
dplyr::select(a2.2, -contains("Petal"))
#筛选a2.2数据中标题不包括"Sepal"的列
dplyr::rename(a2.2, Flower = Species)
#将a2.2数据中的Species标题改成Flower后显示
a2.4.1 = dplyr::select(a2.2, Flower = Species, Sepal.Length, Sepal.Width)
#筛选a2.2数据中Species、Sepal.Length、Sepal.Width这三列,同时将Species改成Flower
#列的合并
d1$Quality = "NAU"
#在d1数据后加一列,列的名称为Quality,内容均为"NAU"
d1group = paste0(d1Flower,"_",d1Quality, "=",d1
#在d1数据后加一列,列的名称为group,内容为每行的”Flower_Quality=Sepal.Length”
d1condition = paste(d1Flower, d1
#在d1数据后加一列,列的名称为condition ,内容为每行的”Flower_Quality”
#列的拆分
library(splitstackshape)
cSplit(d1, splitCols = "group", sep = "_", drop = F,
fixed = T, direction = "wide", makeEqual = T)
#将d1中group这一列进行分割。drop=F,结果中显示group,T则不显示。
#宽表格转变为长表格
library(reshape2)
b1 = melt(data = a1, id.vars = "Fruits",
variable.name = "store",
value.name = "price" )
a1$location = c("NJ","NJ","SZ","SZ","SZ")
d1 = melt(data = a1, id.vars = c("Fruits","location"),
variable.name = "store", value.name = "price" )
#id.vars:标识变量(依旧在列上,位置保持不变的变量);variable.name:为新列变量取名; value.name:对应值所在的变量名
#长表格转变为宽表格
b2 = reshape(data = b1, idvar = "Fruits",
timevar = "store", direction = "wide")
dcast(b1, Fruits ~ store, fun.aggregate = mean, margins = T)
#左边为行标签,右边为列标签;fun.aggregate:聚集函数,如 mean、median、sum;示例 为对行和列进行求平均数;margins=T,加上后显示平均数这一列和行,不加不显示
d2.1 = reshape(data = d1, idvar = c("Fruits", "location"), timevar = "store", direction = "wide")
d2.2 = dcast(d1, Fruits + location ~ store )
library(dplyr)
a1 = read.csv("microbiology.csv", header = T, stringsAsFactors = F)
a2 = read.csv("published_papers.csv", stringsAsFactors = F)
#指的是读入的数据中的字符串数据是否要变成属性数据,stringsAsFactors=FALSE就是不变
成属性数据,按字符串读入。比如‘sex’变量有Fale,Female两种,可以只当做字符串,也可
作为属性变量。
header = T,true则excel第一行用于列名称,具体数据从第二行开始;false则第一行即为
具体数据。
a1=microbiology
a2=published_papers
a3 = merge(a1, a2, by.x = "magazine", by.y = "Journal")
a3.1 = dplyr::inner_join(a1, a2, by = c("magazine" = "Journal"))
#merge 函数类似于 Excel 中的 Vlookup,可以实现对两个数据表进行匹配和拼接的功能;by.x,by.y:指定依据哪些行合并数据框,默认值为相同列名的列
a3.2 = merge(a1, a2, by.x = "magazine", by.y = "Journal", all.x = TRUE)
a3.2 = dplyr::left_join(a1, a2, by = c("magazine" = "Journal"))
a3.3 = merge(a1, a2, by.x = "magazine", by.y = "Journal", all.y = T)
a3.3 = dplyr::right_join(a1, a2, by = c("magazine" = "Journal"))
round(a3$Journal.Impact.Factor, 2)
#a3中Journal.Impact.Factor保留小数点后两位