python均值插补法填补缺失值_R语言笔记(四):特殊值处理
输入数据后,我们就能在 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语言笔记(四):特殊值处理相关推荐
- python 线性回归回归 缺失值 忽略_机器学习 第3篇:数据预处理(使用插补法处理缺失值)...
插补法可以在一定程度上减少偏差,常用的插补法是热卡插补.拟合插补和多重插补.拟合插补,要求变量间存在强的相关性:多重插补(MCMC法),是在高缺失率下的首选插补方法,优点是考虑了缺失值的不确定性. 一 ...
- python预处理缺失值_数据预处理 第3篇:数据预处理(使用插补法处理缺失值)...
插补法可以在一定程度上减少偏差,常用的插补法是热卡插补.拟合插补和多重插补.拟合插补,要求变量间存在强的相关性:多重插补(MCMC法),是在高缺失率下的首选插补方法,优点是考虑了缺失值的不确定性. 一 ...
- 数据预处理 第3篇:数据预处理(使用插补法处理缺失值)
插补法可以在一定程度上减少偏差,常用的插补法是热卡插补.拟合插补和多重插补.拟合插补,要求变量间存在强的相关性:多重插补(MCMC法),是在高缺失率下的首选插补方法,优点是考虑了缺失值的不确定性. 一 ...
- python多重插补_5.4 缺失值插补
5.4 缺失值插补 因为各种各样的原因,真实世界中的许多数据集都包含缺失数据,这类数据经常被编码成空格.NaNs,或者是其他的占位符.但是这样的数据集并不能scikit-learn学习算法兼容,因为大 ...
- 回归插补法_没有完美的数据插补法,只有最适合的
数据缺失是数据科学家在处理数据时经常遇到的问题,本文作者基于不同的情境提供了相应的数据插补解决办法.没有完美的数据插补法,但总有一款更适合当下情况. 我在数据清理与探索性分析中遇到的最常见问题之一就是 ...
- 回归插补法_用均值替换、 回归插补及多重插补进行插补
##设置工作空间 #把"数据及程序" 文件夹复制到F盘下, 再用setwd设置工作空间 setwd("F: /数据及程序/chapter4/示例程序") #读取 ...
- 独家 | 在机器学习中利用统计插补来处理缺失值(附代码)
作者:Jason Brownlee 翻译:吴振东 校对:冯羽 本文约4500字,建议阅读10分钟 本文以病马数据集为例,帮助你了解在机器学习领域如何利用统计策略来处理缺失值,对代码进行了较为详细的讲解 ...
- 多重插补 均值插补_Feature Engineering Part-1均值/中位数插补。
多重插补 均值插补 Understanding the Mean /Median Imputation and Implementation using feature-engine-.! 了解使用特 ...
- python实现-用随机森林填补缺失值、均值填充0填充的比较
sklearn中,可以使用sklearn.impute.SimpleImputer来轻松地填充均值等 import numpy as np import pandas as pd import mat ...
最新文章
- ASP.NET中的加密方法介绍
- jQuery和AngularJS的区别小分析
- linux 系统时间是在哪里记录的,Linux系统如何记录时间
- 电子书下载:The C# Programming Language, 4th Edition
- ubuntu安装VMware出错
- i++ 和 ++i 效率的分析以及自定义类型的自增/自减运算符重载实例
- 宝塔面板 创建 二级域名 Unable to round-trip http request to upstream
- java访问对象的属性_java访问对象的属性和行为详细介绍
- 关于在IBatis中返回DataSet
- 2.C++深入理解 面向对象部分1
- devexpress,dotnetbar控件
- RCC_APB2Periph_AFIO--复用IO时钟的使用
- 软电话HTML界面,软电话条对接
- linux删除用户命令userdel
- 信达生物港交所上市:重点锁定肿瘤领域 募资33亿港元
- js获取对象数组中的id集合
- QChart动态生成图表(曲线)
- 浏览器自带开发工具你知道多少?
- 学习yade日常错误2019.3.22
- Mybatis报错All elements are null