参考 生信星球 公众号教程
R包 tidyr
获得清洁数据
(1)数据框的变形
(2)处理数据框中的空值
(3)根据一个表格衍生出其他表格
(4)实现行或列的分割和合并
安装tidyr包
# install.packages("tidyr")
library(tidyr) # 加载R包
新建一个数据框 用来演示
a<-data.frame(GeneId = rep("gene5",times=3),
SampleName =paste("Sample",1:3,sep=""),
Expression=c(14,19,18))
rep("gene5",times=3) ,rep重复 gene5重复3次
paste("Sample",1:3,sep="") ,paste连接两个字符串,分隔符是'''',无空格
行 raw
列 column,简化写法为col
准备工作part3:认识Tidy Data
我们经常要把手里的数据,转换成 后面分析要用到的格式——清洁数据
举个栗子
不要让sample1,2,3当列名,让他们多重复几遍,合并到一列。
这就是实现了数据框的变形
准备正式结束
(1). 数据变形
1. gather 函数
宽变长
模仿建一个数据框b
b<-data.frame(c('A','B','C'),
c('0.7K','37K','212K'),
c('2K','80K','213K'))
colnames(b)<-c('country','1999','2000')
gather括号里的分别是:
数据框名,需合并的列名(两个),合并后的key列名,value列名。
gather( b, '1999', '2000', key = "year", value = "cases")
# 需合并的列名也可以列在最后 偷懒简写
gather(b, "year", "cases", '1999', '2000')
把原变量名(属性名)做键(key),变量值做值(value)
有种行、列转置的感觉
其中,合并前的列名如果比较多,可以用排除法来偷懒,在上图例子中可用
data<- gather(b,year,cases,-country) #-country的意思就是合并除country外剩下的列
-减号表示 ,除了country列,只转置剩下两列
2. spread()函数:
长变宽 , 变回原来的宽表格
前面数据data , year和cases列 转置
spread(data, year, cases)
(2). 处理缺失值
处理丢失的数据。就是某些单元格有空值的情况。
三种处理方式:
(1).删除整行
(2).根据上下文(瞎)蒙一个
(3).同一列的空值填上同一个数
在公众号【生信星球】后台回复:“数据类型”即可获得 示例数据
读取要记得 设置你文件所在的目录
setwd('C:\\Users\\XFY\\Desktop\\生信\\豆花分享') #设置工作目录
X<-read.csv('doudou.txt') # 示例数据
在这里补充下csv的导入和导出方式。(默认参数好,学R没烦恼)
导入:X<-read.csv('doudou.csv')
导出:write.csv(X,'doudou.csv')
第二列有缺失值 NA
1. 有空值的,整行删除掉
drop_na
drop_na(X,X2)
2. 根据上一行的数值填充上
fill(X,X2) # 不演示了 感觉用不上 不科学
3. 空值填进去特定的一个数值
replace_na() : 要处理的列名 = 要填的值
把数据框X的,列名为X2的列 的空值 填充为0
replace_na(X,list(X2=0))
(3). Expand Tables
1. complete()函数:把空值的位置补全
我们新增一列X3和X2列一样有缺失值
X$X3<-X$X2
complete(X,X1, fill = list(X2=5)) #将第二列X2缺失值改为5
有个参数nesting,筑巢? 可以 调整列顺序?
complete(X,nesting(X2,X1),fill = list(X3=5))
2. expand()函数:列出每列值所有可能的组合
用到前面新建的数据框a
expand(a , GeneId, SampleName, Expression)
就是选中的列中的值各种组合,成为一个新数据格式
(4). split cells:把一列拆成两列
1. separate:按列分割
新建一列geneName 举个栗子用
a$geneName<c('HIF1A|protein_coding',
'GAPDH|protein_coding',
'Xist|ncRNA')
我想把geneName列按 '|'分开
注意 | 在R里面是元字符,需要一个反斜杠\抵消掉它的特殊意义
但是\本身也是元字符, 所以需要两个\, 分隔符 sep='\|'
dd<-separate(a,geneName,into=c('基因名','基因类型'),sep='\\|')
2. separate_rows():分割成两行
原列必须要有分隔符才行
下面把table3 的rate列,按/分隔开,放在下一行
3. unite:分割完了再合并回去
我想把两列 基因名 和 基因类型 合并成一列,按 '|'分隔开开
bb<-unite(dd, '基因名','基因类型',col = "合并的列", sep='|')
奇怪sep='|' 合并时候, 不考虑元字符了