小伙伴们大家好!今天我要用一篇推文精要概括数据清洗中的最基本最关键的步骤,对于零基础的学员一定会有很大收获!数据清洗是完成一篇生信文章最基本但也是最终要的准备工作,如果不会数据清洗,就要错过很多优质数据集,那文章的质量就会大打折扣~当然这一步也是最费时间费脑子的。话不多说,我们进入正题。
我们熟知的生信分析中,少不了TCGA、GEO、Oncomine等数据库的数据集应用,这些大型综合性数据库的数据大多经过统一的处理,这使得我们应用这些数据集得出的结论更加有说服力。因此,这些数据集相关的研究就不计其数,如果想在数据集上找创新是难中之难,可是不创新又怎样发高分文章呢?数据集很多,但能够出成果的少之又少,好不容易找到一个数据集,原始数据杂乱无章,无从下手,成为了众多生信小白很难跨越的一道鸿沟。
这就体现了R语言数据清洗的重要性。说到R语言,大家可能下意识就是差异分析、跑代码出图等等。然而,简单的分析出图只是R语言的强大功能的冰山一角。R是进行数据运算、清洗、汇总及生成概率统计等数据处理的一个绝佳选择。
数据准备的最常见的应用包括数据的抽取、清洗、转换和集成,常常占据了70%左右的工作量。并且很多数据集即便而在数据准备的过程中,数据质量差又是最常见而且令人头痛的问题。那么数据质量的评价标准又是怎么样的呢?
1.数据质量评价的12个维度
(1)数据规范( Data specification):对数据标准、数据模型等规定测量标准。
(2)数据完整性准则( Data integrity fundamentals)。
(3)重复( Duplication):对存在于系统内或系统间的特定字段、记录或数据集意外重复的测量标准。
(4)准确性( Accuracy):对数据内容正确性进行测量的标准;
(5)一致性和同步( Consistency and synchronization):对各种不同的数据信息等价程度的测量。
(6)及时性和可用性( Timeliness and availability):在预期时段内数据对特定应用的及时程度和可用程度的测量标准。
(7)易用性和可维护性( Ease of use and maintainability):对数据可被访问,使用程度,以及数据能被更新、维护和管理程度的测量标准。
(8)数据覆盖( Data coverage):相对于数据总体或全体相关对象数据的可用性和全面性的测量标准。
(9)表达质量( Presentation quality):如何进行有效信息表达以及如何从用户中收集信息的测量标准。
(10)可理解性,相关性和可信度( Perception, relevance and trust)。
(11)数据衰变( Data decay):对数据负面变化率的测量标准。
(12)效用性 ( Transactability):数据产生期望业务交易或结果程度的测量标准。
在评估项目数据质量过程中,需先选取几个合适的数据质量维度,再针对每个所选维度,制定评估方案,选择合适的评估手段进行测量,最后合并和分析所有质量评估结果。那我们需要对数据进行什么样的处理呢?
2.数据规范化处理的8个关键步骤① 缺失值处理
② 重复数据检测
③ 异常数据处理
④ 逻辑错误检测
⑥ 不一致数据
⑦ 相关性分析(剔除与问题不相关的冗余的属性)
⑧ 数据变换(标准化,归一化、线性化等)
一般来说,在获得了原始数据之后,不能直接开始进行统计分析等操作。
最后我们需要一个最基本的结果:每个变量各占一列;每个观测值各占一行;每个表格或者文件只储存一种观测值的数据!
3.R语言数据处理及实例应用
plyr包ddply函数
我先推荐一个最常用也是最好用的函数——ddply!这个函数位于plyr包内,用于对data.frame进行分组统计,是用于数据清洗和整理常用的函数,比内置的base包中的类似功能的速度快,且可读性强。plyr包对于R中数据的分块处理非常好用,相对于xapply系列函数,有更为宽泛的数据适用和数据分割能力,也能对分块数据进行多重处理。
R包参数如下
ddply(
.data,
.variables,
.fun = NULL,
...,
.progress = "none",
.inform = FALSE,
.drop = TRUE,
.parallel = FALSE,
.paropts = NULL
)
函数各部分解析如下:
① (.data):原始数据集;
② (.variables):按照某个或几个变量对数据集分割;
③(.fun):具体执行操作的函数,对分割后的每一个子数据集,调用该函数
④ 其他参数可选,主要函数有:%>%(管道符,可进行多步操作),filter(筛选行),select(筛选列),arrange(排序),group_by(分组),mutate(变形,增加新的列),summarise(汇总),length(对列进行调整)等等
小伙伴们可以多多挖掘。
下面我们就通过官方示例进行演示:
函数各部分解析如下:
# 通过两个变量来总结数据集
dfx
group = c(rep('A', 8), rep('B', 15), rep('C', 6)),
sex = sample(c("M", "F"), size = 29, replace = TRUE),
age = runif(n = 29, min = 18, max = 54)
)
# “group” and “sex” 两个变量可以通过'.' 直接引用
ddply(dfx, .(group, sex), summarize,
mean = round(mean(age), 2),
sd = round(sd(age), 2))
# 使用.variables公式的示例
ddply(baseball[1:100,], ~ year, nrow)
# 引用两个功能; nrow 和 ncol
ddply(baseball, .(lg), c("nrow", "ncol"))
# 计算每年的平均分
rbi
mean_rbi = mean(rbi, na.rm = TRUE))
# 绘制结果折线图
plot(mean_rbi ~ year, type = "l", data = rbi)
# 根据每个对象的开始年份(id)设置新的变量
base2
career_year = year - min(year) + 1
)
dplyr包
dplyr包的作者是著名的ggplot2包的Hadley Wickham。dplyr包主要用于数据清洗和整理,主要功能有:行选择、列选择、统计汇总、窗口函数、数据框交集等是非常高效、友好的数据处理包,主要有以下几个函数:① 选择:select()
② 筛选:filter()
③ 排序:arrange()
④ 分组:group_by()
⑤ 汇总:summarise()
⑥ 变形:mutate()
下面我就为大家介绍其中几个函数的实例应用。
> library(dplyr)
> data(mtcars)
> str(mtcars)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: num 4 4 1 1 2 1 4 2 2 4 ...
> #1.按行筛选:filter(),按给定的逻辑判断筛选出符合要求的子数据集, 类似于 subset() 函数,如:
> filter(mtcars, mpg>=22)
mpg cyl disp hp drat wt qsec vs am gear carb
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
> filter(mtcars, cyl == 4 | gear == 3)
mpg cyl disp hp drat wt qsec vs am gear carb
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
> #2.按列筛选:select(), 用列名作参数来选择子数据集。dplyr包中提供了些特殊功能的函数与select函数结合使用, 如:
> data(iris)
> iris = tbl_df(iris)
> #选取变量名前缀包含Petal的列
> select(iris, starts_with("Petal"))
# A tibble: 150 x 2
Petal.Length Petal.Width
1 1.4 0.2
2 1.4 0.2
3 1.3 0.2
# ... with 140 more rows
> #选取变量名前缀不包含Petal的列
> select(iris, -starts_with("Petal"))
# A tibble: 150 x 3
Sepal.Length Sepal.Width Species
1 5.1 3.5 setosa
2 4.9 3 setosa
3 4.7 3.2 setosa
# ... with 140 more rows
> #3.mutate变量变形: mutate(), 可以对数据框中已有的变量进行操作或者增加变量
> #新增列
> mtcars %>% mutate(cyl2 = cyl * 2,cyl4 = cyl2 * 2)
mpg cyl disp hp drat wt qsec vs am gear carb cyl2 cyl4
1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 12 24
2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 12 24
3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 8 16
> #删除列
> mtcars %>% mutate(mpg = NULL,disp = disp * 0.0163871)
cyl disp hp drat wt qsec vs am gear carb
1 6 2.621936 110 3.90 2.620 16.46 0 1 4 4
2 6 2.621936 110 3.90 2.875 17.02 0 1 4 4
3 4 1.769807 93 3.85 2.320 18.61 1 1 4 1
> #4.排序函数: arrange(), 这里需要注意排序与排名的区别,如:
> #按给定的列名依次对行进行排序
> arrange(mtcars, mpg)
mpg cyl disp hp drat wt qsec vs am gear carb
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
> arrange(mtcars, mpg,disp)
mpg cyl disp hp drat wt qsec vs am gear carb
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
常见的数据变换函数
① abs(x) 绝对值
② sqrt(x) 开根号
③ round(x,digits=n) 四舍五入,例:round(3.475,digits=2) = 3.48
④ cos(x), sin(x) etc.三角变换
⑤ log(x) 对数变换
⑥ log2(x), log10(x) 以2、10为底的对数变换
⑦ exp(x) 指数变换
小伙伴们是不是对数据清洗和处理有了一个明确的思维框架呢?照着这个方向去把“房子”逐步搭建起来,熟练后你会发现数据清洗并没有这么复杂啦!
参考文献
Hadley Wickham (2011). The Split-Apply-Combine Strategy for Data Analysis. Journal of Statistical Software, 40(1), 1-29. http://www.jstatsoft.org/v40/i01/.
欢迎大家关注解螺旋生信频道-挑圈联靠公号~—END—
转载请注明:解螺旋·临床医生科研成长平台