本文为 机器学习实战 | 数据预处理(基于 Python) 的姊妹篇 R 语言实现。
1. 变量名转换 • 转换大小写:使用 toupper() 和 tolower() 函数• 去除特殊符号,例如 .,空格等:可用 gsub() 进行替换或 strsplit() 根据字符分割并提取字符串。
2. 数值离散化 所谓数值离散化就是把连续型数据转变成离散数据,比如把连续的收入值分为 $0~$10000、$10001~$25000、$25001~$50000、$50001~$75000、$75001~$100000 和 $100001~$150000。使用 cut() 函数可以很方便地进行这类操作。
cut ( x , breaks , labels = NULL , include . lowest = F , right = T , dig . lab = 3 , ordered_result = F ) • x:数值向量• breaks:指定分割点的数量的整数,或者制定分割点位置的向量• labels:输出因子水平标签• include.lowest:表明临界点是否包含在内• right
:表示区间是否左开右闭(当right = F,区间左闭右开)• dig.lab:当产生标签时,标签有效数字• ordered_results:返还值是否转换成有序因子
3. 日期处理 可用 lubridate 包处理日期和时间数据。
解析日期与时间 lubridate 包的 ymd() 系列函数来读取日期数据。y,m 和 d 分别对应年、月和日。读取日期时,根据日期时间的元素顺序,选择相应的函数。例如,在下面的日期中,月份在首,其次是日,然后是年。所以用 mdy() 函数:
> mdy ( "12-01-2010" ) [ 1 ] "2010-12-01 UTC" 要是顺序是日月年,那就得用 dmy() 函数:
> dmy ( "12-01-2010" ) [ 1 ] "2010-01-12 UTC" 当然也有 ydm() 函数等等。
这些函数会自动识别日期中的分隔符,包括:-,/,. 和 ``(无分隔符)。
操作日期与时间 每个日期时间都是不同元素的组合,我们可调用不同的函数来提取对应信息。
4. 对分类数据进行编码 可用 car 包的 recode 函数将数值或者字符向量、factor 变量重新编码。
recode ( var , recodes , as . factor , as . numeric = TRUE , levels ) • var:为数值向量,字符向量或者 factor 变量• recodes:为设定重新编码规则的字符串• as.factor:如果 var 是一个 factor,则默认为TRUE,否则为 FALSE• as.numeric:默认为 TRUE,当 as.factor = False 时输出结果指定为数字• levels:指定新的编码分组的顺序(默认是按照分组名称排序)
x rep ( 1 : 3 , 3 ) x ## [1] 1 2 3 1 2 3 1 2 3 recode ( x , "c(1,2)='A';
else = 'B'") ## [1] "A" "A" "B" "A" "A" "B" "A" "A" "B" Recode ( x , "1:2='A'; 3='B'" ) ## [1] "A" "A" "B" "A" "A" "B" "A" "A" "B" 5. 合并数据集 可用 merge(),cbind() 和 rbind() 来合并数据集。
merge():根据列名合并数据集merge ( x , y , by = , by . x = , by . y = , all = , all . x = , all . y = ,...) • x:第一个数据框• y:第二个数据框• by, by.x, by.y:指定两个数据框中匹配列名称。默认使用两个数据框中相同列名称• all,
all.x, all.y:指定合并类型的逻辑值。
另外还有,cbind() 根据列合并数据集以及 rbind() 根据行合并数据集,当然也可以用 dplyr 中的 join 等等。
6. 使用 dplyr 包进行数据操作 dplyr 也是我们常用于处理数据框的工具,例如:
• filter():按行筛选样本• select():按列选择变量• arrange():按给定的列名依次对行进行排序• mutate() 和 transmute():根据一个或多个变量生成新变量或重定义已有变量。mutate() 的返回结果会保留原有变量,而 transmute() 则只返回新变量。• distinct:去重,仅返回无重复的行
7. 处理缺失数据 填充缺失值 可用 e1071 包中的 impute() 函数填充缺失值:
impute ( x , what = c ( "median" , "mean" ))
what="median" 表示用对应列的中位数填充;what="mean" 表示用对应列的平均值填充。
impute() 返回的是一个矩阵,而不是一个数据框。所以我们必须多加一步,将结果转换回数据框的形式。
删除缺失值 可用 complete.cases() 函数判断数据框中没有缺失值的行,进一步进行删除。或者直接用 na.omit():
newdata data [ complete . cases ( data ),] 8. 特征缩放:z-score 标准化 stats 包中的 scale() 函数,可以用于缩放数值,使用平均值和标准差对数据集进行标准化。
scale ( x , center = TRUE , scale = TRUE ) • x:数据矩阵• center:逻辑值或长度为 x 列数的数值向量,其中“类似数字”表示如果is.numeric(。)不正确,则as.numeric(。)将成功应用• scale:逻辑值或长度为 x 列数的数值向量
center
的值确定如何执行列中心化。如果 center 是数字向量,则 x 的每一列都将减去相应值。如果 center 为 TRUE,则通过减去 x 相应列的均值(省略 NA)来完成中心化,如果 center 为 FALSE,则不进行中心化。
scale 的值确定中心化后如何执行列缩放。如果 scale 是一个数字向量,则 x 的每一列都将除以 scale 中的相应值。如果 scale 和 center 都为 TRUE 则缩放是将 x 除以它们的标准差。如果 scale 为 FALSE,则不进行缩放。
所以默认情况下 scale(x) 就相当于 (x - mean(x)) / sd(x)。
文末友情推荐 • 《2021生信学习班起航,先送福利 》• 《96核心384G内存的超级服务器(共享)使用权一年 》