输入数据后,我们就能在 R 中对数据进行一系列的操作了。但现实获得的第一手数据往往都是不完整、不整齐的,比如存在数据本身缺失值、离群值,数据框存在冗余行或列,抑或数据需要进一步加工才能获取有意义的变量等。因此,分析数据前对的数据处理工作极为重要。

本文介绍的数据处理内容主要包括:

  • 1. 特殊值处理

    • 1.1 缺失值
    • 1.2 离群值
    • 1.3 日期
  • 2. 数据转换(base vs. dplyr)
    • 2.1 筛选(subset vs. filter/select/rename)
    • 2.2 排序(order vs. arrange)
    • 2.3 转换(transform vs. mutate/transmute)
    • 2.4 分组与概括(group_by/summarise)
  • 3. 数据框重塑(base vs. dplyr)
    • 3.1 数据框的合并(rbind/cbind vs. bind_rows/bind_cols)
    • 3.2 数据框的关联(merge vs. *_ join)
    • 3.3 数据框的长宽转换(reshape2 包)

本文我们学习特殊值处理的有关内容。后文链接:

Sub-woo:R语言笔记(四):数据处理(中)​zhuanlan.zhihu.com

Sub-woo:R语言笔记(四):数据处理(下)​zhuanlan.zhihu.com

有出错或补充的地方请大神们不吝赐教,作者会持续更新!


1. 特殊值处理

1.1 缺失值

  • 缺失值的识别
is.na(x)
# 返回 x 中每个元素的缺失值判定,若为缺失值则返回 TRUE,否则返回 FALSE
complete.cases(x)
# 返回 x 中每一元素的判定结果(向量);返回每一行是否含有缺失值的判定结果(矩阵或数据框的判定)
# 若含有缺失值,则返回 FALSE,否则返回 TRUEx <- c(1, 2, NA, 3, 4)
y <- matrix(1: 12, nrow = 3, ncol = 4)
z <- data.frame(x = c(1, 3, 5, 7), y = c(2, 4, NA, 8))
is.na(x)
# [1] FALSE FALSE  TRUE FALSE FALSE
complete.cases(x)
# [1]  TRUE  TRUE FALSE  TRUE  TRUE
is.na(y)
#       [,1]  [,2]  [,3]  [,4]
# [1,] FALSE FALSE FALSE FALSE
# [2,] FALSE FALSE FALSE FALSE
# [3,] FALSE FALSE FALSE FALSE
complete.cases(y)
# [1] TRUE TRUE TRUE
is.na(z)
#          x     y
# [1,] FALSE FALSE
# [2,] FALSE FALSE
# [3,] FALSE  TRUE
# [4,] FALSE FALSE
complete.cases(z)
# [1]  TRUE  TRUE FALSE  TRUE

  • 缺失值的处理

一般缺失值的处理方式包括:剔除法、均值替代法、回归插补法、插值法。剔除法就是视情况剔除包含缺失值的行/列;均值替代法使用缺失值对应变量的总体平均值进行替代;回归插补法将缺失值对应变量作为因变量,其他变量作为自变量进行回归拟合,使用拟合值填补缺失值;常用的插值法包括拉格朗日插值法、牛顿均差/差分插值法、分段线性插值法。

本文只介绍剔除法,其他处理方法的 R 实现会在之后陆续更新。

x <- na.omit(x)
# 删除 x 中包含缺失值的行(适用于多维结构)
xxx(x, na.rm = TRUE)
# 在部分统计分析函数中,指定 na.rm = TRUE 自动对缺失值进行剔除处理mean(z[, 2])
# [1] NA
mean(z[, 2], na.rm = T)
# [1] 4.666667

1.2 离群值

  • 离群值的识别

离群值有很多种判定,本文通过实际案例介绍一种基本的识别方法。

install.packages(c("tidyverse", "nycflights13"))
library(tidyverse)
library(nycflights13)
# 我们将利用该包中的 flights 数据集练习
dat <- filter(flights, !is.na(dep_delay))
# 筛选出 dep_delay 变量不含缺失值的行
attach(dat)
# 绑定数据框
summary(dep_delay)
#     Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's
#  -43.00   -5.00   -2.00   12.64   11.00  1301.00    8255
# 获取 dat 数据集中 dep_delay 变量的基本统计信息
Q1 <- -5      # 四分之一分位数
Q3 <- 11      # 四分之三分位数
IQR <- Q3 - Q1 # 计算 IQR
lower_bound <- Q1 - 1.5 * IQR  # 计算判定下界
upper_bound <- Q3 + 1.5 * IQR  # 计算判定上界
outlier <- filter(flights, dep_delay < lower_bound | dep_delay > upper_bound)
# 筛选出不在判定上界和下界之间的行,并作为离群值
not_outlier <- filter(flights, dep_delay >= lower_bound &dep_delay <= upper_bound)
# 筛选出位于判定上界和下界之间的行,并作为正常值

总结一下,先获取数据的四分之一分位数和四分之三分位数,相减计算 IQR( interquartile range,四分位距);四分之一分位数扣除 1.5 倍 IQR 得到判定下界,四分之三分位数加上 1.5 倍 IQR 得到判定上界。得到的结果和箱型图作图结果十分近似(实际似乎并不一致,作者也不是很清楚 R 语言箱型图的计算公式是什么)

例子中的数据处理函数会在下篇文章进行介绍,这里只需要了解离群值的判定依据即可。

  • 离群值的处理

具体情况具体分析,一般可以采取剔除法或剔除后使用插值法进行填补,本文不进行展开。

1.3 日期

在处理数据过程中,我们有时会遇到形如 30/2020/1 或 2020-1-30 等格式的日期数据,若原始数据不做特殊处理,R 语言不会自动将其转换为日期格式,而是以字符串或因子的形式读取。日期格式的数据有许多优点,如参与数值运算,进行时间序列分析,或便捷地产生连续的日期数据等。

  • 将数据转换为日期格式

本文介绍使用 as.Date() 函数将数据转换为日期格式:

date <- as.Date(date, format = "")

format 参数中的常用日期格式如下:

"%d":表示月份中的天数
"%m":表示数字形式的月份
"%b":表示缩写形式的月份
"%B":表示英文形式完整月份
"%y":表示二位数字形式的年份
"%Y":表示四位数字形式的年份

下面举例说明:

today <- "30/2020/1"
today <- as.Date(today, format = "%d / %Y / %m")
today + 1
# [1] "2020-01-31"today <- "20-1-30"
today <- as.Date(today, format = "%y - %m - %d")
today + 1
# [1] "2020-01-31"today <- "3rd/January/2020"
Sys.setlocale(locale = "english")
# 将语言环境设置为英文
today <- as.Date(today, format = "%d rd / %B / %Y")
today + 1
# [1] "2020-01-04"today <- "2020年1月30日"
Sys.setlocale(locale = "chinese")
# 将语言环境设置为中文
today <- as.Date(today, format = "%Y 年 %m 月 %d 日")
today + 1
# [1] "2020-01-31"

【注】分隔符号不能遗漏,原始数据形式和 format 中的日期格式需要一一对应;如果转换出现问题,可能是语言环境不兼容导致的,可使用代码:Sys.setlocale(locale = "") 进行设置。

  • 生成连续的日期数据

我们可以使用 seq() 和 ts() 函数生成连续的日期数据。代码实现如下:

begin <- as.Date("2020-01-01")
end <- as.Date("2020-01-16")seq(begin, end, by = 1)
# 按单日生成连续的日期
# [1] "2020-01-01" "2020-01-02" "2020-01-03" "2020-01-04" "2020-01-05" "2020-01-06"
# [7] "2020-01-07" "2020-01-08" "2020-01-09" "2020-01-10" "2020-01-11" "2020-01-12"
# [13] "2020-01-13" "2020-01-14" "2020-01-15" "2020-01-16"
seq(begin, end, by = 7)
# 按周(7天)生成连续日期
# [1] "2020-01-01" "2020-01-08" "2020-01-15"seq(begin, end, length.out = n)
# 在 begin 到 end 的时间期间取 n 个时间节点,返回各个节点
seq(begin, by = 7, length.out = n)
# 从 begin 开始,以周(7天)为单位,生成 n 个时间节点

接下来我们单独介绍一下 ts() 函数。在 R 中 ts() 的形式如下:

ts(data = NA, start = 1, end = numeric(), frequency = 1,deltat = 1, ts.eps = getOption("ts.eps"), class = , names = )

常用的参数有以下几种:

data: 一个向量或矩阵(数据框需要使用 data.matrix 矩阵化)
start: 第一个观测值对应的时间点,由一个整数或两个整数构成的向量设定
end: 最后一个观测值对应的时间点,设定形式与 start 一致
frequency:每个单位时间长度覆盖的观测值个数
deltat: 两个相邻观测值对应的时间节点差值,与 frequency 有且仅有一个需要设定

举几个例子:

set.seed(100)
dat <- sample(0:50, 30, replace = T)
# 在 0 到 50 之间随机生成 100 个整数
dat <- ts(dat, frequency = 12, start = c(2020, 1))
# 2020年 1 月起始,按月份将 dat 时间序列化
dat
#      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
# 2020   9  37  47  50  24  13  43  22  21   5   3   5
# 2021  33   6   6  42  17  11  34  50   7  17  24   1
# 2022  50   3   3  47  31  20dat <- ts(dat, frequency = 4, start = c(2020, 3))
# 2020 年第 3 季度起,按季度将 dat 时间序列化
dat
#      Qtr1 Qtr2 Qtr3 Qtr4
# 2020              9   37
# 2021   47   50   24   13
# 2022   43   22   21    5
# 2023    3    5   33    6
# 2024    6   42   17   11
# 2025   34   50    7   17
# 2026   24    1   50    3
# 2027    3   47   31   20

python均值插补法填补缺失值_R语言笔记(四):特殊值处理相关推荐

  1. python 线性回归回归 缺失值 忽略_机器学习 第3篇:数据预处理(使用插补法处理缺失值)...

    插补法可以在一定程度上减少偏差,常用的插补法是热卡插补.拟合插补和多重插补.拟合插补,要求变量间存在强的相关性:多重插补(MCMC法),是在高缺失率下的首选插补方法,优点是考虑了缺失值的不确定性. 一 ...

  2. python预处理缺失值_数据预处理 第3篇:数据预处理(使用插补法处理缺失值)...

    插补法可以在一定程度上减少偏差,常用的插补法是热卡插补.拟合插补和多重插补.拟合插补,要求变量间存在强的相关性:多重插补(MCMC法),是在高缺失率下的首选插补方法,优点是考虑了缺失值的不确定性. 一 ...

  3. 数据预处理 第3篇:数据预处理(使用插补法处理缺失值)

    插补法可以在一定程度上减少偏差,常用的插补法是热卡插补.拟合插补和多重插补.拟合插补,要求变量间存在强的相关性:多重插补(MCMC法),是在高缺失率下的首选插补方法,优点是考虑了缺失值的不确定性. 一 ...

  4. python多重插补_5.4 缺失值插补

    5.4 缺失值插补 因为各种各样的原因,真实世界中的许多数据集都包含缺失数据,这类数据经常被编码成空格.NaNs,或者是其他的占位符.但是这样的数据集并不能scikit-learn学习算法兼容,因为大 ...

  5. 回归插补法_没有完美的数据插补法,只有最适合的

    数据缺失是数据科学家在处理数据时经常遇到的问题,本文作者基于不同的情境提供了相应的数据插补解决办法.没有完美的数据插补法,但总有一款更适合当下情况. 我在数据清理与探索性分析中遇到的最常见问题之一就是 ...

  6. 回归插补法_用均值替换、 回归插补及多重插补进行插补

    ##设置工作空间 #把"数据及程序" 文件夹复制到F盘下, 再用setwd设置工作空间 setwd("F: /数据及程序/chapter4/示例程序") #读取 ...

  7. 独家 | 在机器学习中利用统计插补来处理缺失值(附代码)

    作者:Jason Brownlee 翻译:吴振东 校对:冯羽 本文约4500字,建议阅读10分钟 本文以病马数据集为例,帮助你了解在机器学习领域如何利用统计策略来处理缺失值,对代码进行了较为详细的讲解 ...

  8. 多重插补 均值插补_Feature Engineering Part-1均值/中位数插补。

    多重插补 均值插补 Understanding the Mean /Median Imputation and Implementation using feature-engine-.! 了解使用特 ...

  9. python实现-用随机森林填补缺失值、均值填充0填充的比较

    sklearn中,可以使用sklearn.impute.SimpleImputer来轻松地填充均值等 import numpy as np import pandas as pd import mat ...

最新文章

  1. ASP.NET中的加密方法介绍
  2. jQuery和AngularJS的区别小分析
  3. linux 系统时间是在哪里记录的,Linux系统如何记录时间
  4. 电子书下载:The C# Programming Language, 4th Edition
  5. ubuntu安装VMware出错
  6. i++ 和 ++i 效率的分析以及自定义类型的自增/自减运算符重载实例
  7. 宝塔面板 创建 二级域名 Unable to round-trip http request to upstream
  8. java访问对象的属性_java访问对象的属性和行为详细介绍
  9. 关于在IBatis中返回DataSet
  10. 2.C++深入理解 面向对象部分1
  11. devexpress,dotnetbar控件
  12. RCC_APB2Periph_AFIO--复用IO时钟的使用
  13. 软电话HTML界面,软电话条对接
  14. linux删除用户命令userdel
  15. 信达生物港交所上市:重点锁定肿瘤领域 募资33亿港元
  16. js获取对象数组中的id集合
  17. QChart动态生成图表(曲线)
  18. 浏览器自带开发工具你知道多少?
  19. 学习yade日常错误2019.3.22
  20. Mybatis报错All elements are null

热门文章

  1. wps中删除我的设备(已经不使用的)
  2. 巧用键盘快速定位选定的Word文本
  3. 外贸综合型企业解决方案丨汇信外贸软件
  4. 除了编程语言本身,你如果还懂这 7 点,绝对可以在北上深杭拿到 20k
  5. Microsoft Word 教程:如何在 Word 中更改页边距、创建新闻稿栏?
  6. Android Ril库总结
  7. 用什么软件抓cd音轨音质最好_什么APP听音乐好?
  8. Arcmap转nc文件为TIFF格式(以逐月降水量数据集转年均数据为例)
  9. 使用python绘制二元函数对应的曲面
  10. 这简直是无敌好嘛!阿里巴巴开源落地可实操项目:网约车+咚宝商城+英雄传说三合一