本文为
机器学习实战 | 数据预处理(基于 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()
返回的是一个矩阵,而不是一个数据框。所以我们必须多加一步,将结果转换回数据框的形式。