今天继续R
今天有大坑!!!!!有坑才有大收获!!!!!
今天让我觉得最招人爱的事情就 小抄 这个东西
开饭!!!!!
小抄
就是R包的说明书(cheatsheet),了解后上手老快了,上手快了,离起飞也不远了!!!
如何获取一个R包的 小抄
方法1:百度/谷歌XX cheatsheet
方法2:去这里 https://www.rstudio.com/resources/cheatsheets/
方法3:关注生信星球微信公众号,后台输入某一个包名,例如:tidyr
什么是tidyr
既然都去人家公众号搜索了,那就今天来学习一下tidyr这个R包
它的功能主要有:
(1)数据框的变形
(2)处理数据框中的空值
(3)根据一个表格衍生出其他表格
(4)实现行或列的分割和合并
这个包是把你要用的数据处理成标准而统一的数据框(Tidy Data,下面有解释),才能进行进一步的数据处理和作图,可以说是万里长征第一步!
Step1安装R包
1.打开Rstudio,设置好工作目录。代码窗口或控制台输入:library(tidyr)如果之前没有安装则会显示错误,信息为:Error in library(tidyr):不存在叫'tidyr'这个名字的程辑包
2.既然没有tidyr,那我们就下载安装它:install.packages("tidyr")
(这里会默认安装到你的工作目录里,下载很慢,只要控制台不出现>,就一直等着)
可能出现的报错
如出现报错可以尝试一下解决方案:换国内镜像,如下
修改后重新 install.packages("tidyr")
library(tidyr)
没有报错成功
install.packages("tidyr")
library(tidyr)
Step2建立数据框
1.新建数据框
a<-data.frame(GeneId = rep("gene5",times=3),SampleName =paste("Sample",1:3,sep="_"),Expression=c(14,19,18))
View(a)
#新建数据框,并将其赋值给a
#rep:重复,括号中填要重复的字符和重复次数。
#paste:连接两个字符串,括号要填两个代连接字符并指定分隔符(sep),没有分隔符就填sep=“”。
#1:3表示从1到三。如需一列中需要填入三个无规律的数字,可以用向量c(1,3,4),同样如果填的是字符串也需要加双引号,例如c("doudou","huahua","xiaoyu")
2.了解概念:key-value--“键值对” ,表示一种对应关系。“键”和“值”都是列名,如SampleName和Expression的对应。
3.函数后面一般都要加括号,括号里第一个参数是都数据框名
4.字符串要加双引号(行名和列名也是字符串,但是可以不用加),其他单元格(姑且这么叫了)里出现的字符串要加。
行:raw;列:col
Step3开始认识Tidy Data
Tidyr就是干下面这些活的
1.Reshape Data
gather:我就是刚才的魔法棒
spread:我能让tidy data一夜回到解放前。
小抄闪亮登场!!!!(有你真好)
实战来了!!!
################################1.Reshape Data
b<-data.frame(country= c("A","B","C"),"1999"= paste(c(0.7,37,212),"K"),"2000" = paste(c(2,80,213),"K"))
View(b)
C<-data.frame(country= c("A","B","C"),`1999`= paste(c(0.7,37,212),"K"),`2000` = paste(c(2,80,213),"K"))
View(c)
d<-data.frame(country= c("A","B","C"),'1999'= paste(c(0.7,37,212),"K",sep="_"),'2000' = paste(c(2,80,213),"K"))
View(d)
###下面这条命令是错的,原因如下e<-data.frame(country= c("A","B","C"),1999= paste(c(0.7,37,212),"K",sep="_"),2000 = paste(c(2,80,213),"K"))
gather(d,X1999,X2000,key = "year",value = "cases") #gather魔法棒
gather(d,"year","cases",X1999,X2000) #推荐的偷懒做法
gather(d,year,cases,-country) #-country的意思就是合并除country外剩下的列
小抄又来了--处理丢失的数据(就是某些单元格有空值的情况)
三种处理方式:
(1).删除整行
(2).根据上下文(瞎)蒙一个
(3).同一列的空值填上同一个数。
################################2.Handle Missing Values
getwd()#看看我现在在哪呢
setwd(dir='C:/Users/Dell/Desktop/Potato_learn_R')#找到自己的要工作的路径
X<-read.csv('doudou.txt')
View(X) #看一下X是什么结构信息,知道了,X2列里面有NA,开搞
e<-drop_na(X,X2)
View(e) #drop_na()干了啥?哦~,把有空值的,整行删除掉
f<-fill(X,X2)
View(f) #fill()又干了啥?哦~,根据上一行的数值填充上
g<-replace_na(X,list(X2=2))
View(g) #replace_na()又干了啥?哦~,空值填进去特定的一个数值,这里是用2来填充
小抄还来-----我的大坑也随之而来
###############################3. Expand Tables
####complete(把空值的位置补全)
complete(X,nesting(X1),fill = list(X2=5))
因为没有提供com.cvs文件,所以我模仿的花花给的截图自己建立了一个一样内容的cvs,她的数据是张这样的
于是我也去csv建了一样内容名字为Potato.cvs文件
建立好后,就将Potato.cvs导入Rstudio
####进入工作目录建立一个如下cvs文件,命名为Potato.cvs,回到Rstudio继续操作
Potato <- read.csv("Potato.csv")
View(Potato) #其中有三个空值(NA),我要用ddd relate填充
但是很快我就发现这个GeneId怎么是个乱码,那我就想,用之前学到的,我改一下它第一列的名字不就ok了么,于是我开始开名字
colnames(Potato)[1]<-"GeneId"
View(Potato)
修改后一看,不错,于com.csv,完全一致了,那么就开始进行下面的工作吧
complete(Potato,nesting(GeneId,SampleName,Expression),fill = list(Annotion="ddd relate"))
我的天,怎么可能,我反复检测了所有信息,试了好多次,还是报错,头大了,我就去研究花花这步是生成了什么
她执行成功了,我和她哪里不同,这是我发现我的结果在红箭头位置是
class(Potato) #查看Potato类型,数据框
class(Potato[,1]) #查看Potato第一列元素类型,factor
Potato[,1]<-as.character(Potato[,1]) #将Potato第一列元素类型factor改为char
class(Potato[,1]) #再次查看Potato第一列元素类型,这次为chr了
Potato[,2]<-as.character(Potato[,2])
class(Potato[,2])
Potato[,4]<-as.character(Potato[,4])
class(Potato[,4])
View(Potato)
complete(Potato,nesting(GeneId,SampleName,Expression),fill = list(Annotion="ddd relate"))
这一步跑通真心不易!!!!(继续往下走)
#小抄常来----expand(列出每列值所有可能的组合)
####expand列出每列值所有可能的组合
pin2<-data.frame(GeneId = rep("gene5",times=3),SampleName =paste("Sample",1:3,sep=""),Expression=c(14,19,18))
View(pin2)
expand(pin2,GeneId,SampleName,Expression)
小抄天天来----split cells(一列拆成两列)
###############################4.split cells(把一列拆成两列。目测原列必须要有分隔符才行)
####合并unite
w<-data.frame(country= c("A","B","C"),`1999`= paste(c(0.7,37,212),"K"),`2000` = paste(c(2,80,213),"K"))
View(w)
unite(w,`X1999`,`X2000`,col = "`X1999`",sep = "/") #合并后的列名为X1999
#Y<-unite(w,`X1999`,`X2000`,col = "`X1999`",sep = "/")
#View(Y)
####我们先合并,当做创建一个合并的数据用于后面拆分split学习
Potato_split <- read.csv("Potato_chr.csv")
View(Potato_chr)
Z<-complete(Potato,nesting(GeneId,SampleName,Expression),fill = list(Annotion="ddd relate"))
unite(Z,SampleName,Expression,Annotion,col = "Unite_information",sep = "/")
unite<-unite(Z,SampleName,Expression,Annotion,col = "Unite_information",sep = "/")
write.csv(unite,file = "unite.csv")
####开始拆分
unite_split<-read.csv("unite.csv",header =T,row.names=1)
separate(unite_split,Unite_information,into=c("xxx","yyy","zzz")) #列拆分
separate_rows(unite_split,Unite_information) #行拆分
今日一导-----感谢学习小组林同学