本文介绍用简单方法快速替换缺失值。实际应用中要根据实际情况选择合适的方式填充缺失值。

填充数据框缺失值

通常我们会用特定列的均值或中位数填充数据框列的缺失值。对应的代码大概如下:

df$col[is.na(df$col)] <- mean(df$col, na.rm=TRUE)

如果所有列都是数值类型,可以使用下面代码模板:

for(i in 1:ncol(df)) {df[ , i][is.na(df[ , i])] <- mean(df[ , i], na.rm=TRUE)
}

示例

#create data frame
df <- data.frame(var1=c(1, NA, NA, 4, 5),var2=c(7, 7, 8, NA, 2),var3=c(NA, 3, 6, NA, 8),var4=c(1, 1, 2, 8, 9))#replace missing values in first column with mean of first column
df$var1[is.na(df$var1)] <- mean(df$var1, na.rm=TRUE)#view data frame with missing values replaced
df#       var1 var2 var3 var4
# 1 1.000000    7   NA    1
# 2 3.333333    7    3    1
# 3 3.333333    8    6    2
# 4 4.000000   NA   NA    8
# 5 5.000000    2    8    9## 一次性使用中位数替换for(i in 1:ncol(df)) {df[ , i][is.na(df[ , i])] <- median(df[ , i], na.rm=TRUE)
}df#       var1 var2 var3 var4
# 1 1.000000    7    6    1
# 2 3.333333    7    3    1
# 3 3.333333    8    6    2
# 4 4.000000    7    6    8
# 5 5.000000    2    8    9

上面示例一次性成功填充了所有缺失值,但有时会遇到列不一定都是数值类型,如有字符型,遇到字符类型则不能求均值,只能用众数填充。这是就会遇到动态引用变量问题,下面我们来介绍如果动态引用变量。

dplyr mutate函数动态引用变量

要在mutate函数中动态引用变量,需要使用 !! 操作符,文档中描述如下:

!! 操作符去掉参数的引号,并在上下文环境中立刻评估其值。
我们可以使用rlang::sym(bolname)函数:指定字符串参数返回变量符号, 与直接使用.data[[bolname]] 效果一样。

library(pacman)
p_load(dplyr, tibble)df1 <- tibble(a=c(1,2,3,4), b=c("a","b","c","d"))
for (cn in colnames(df1)) {if(cn %in% names(df1[, sapply(df1, is.numeric)])){df1 %>% mutate(!!cn := !!rlang::sym(cn) * 2) -> df1# df1 %>% mutate(!!cn := .data[[cn]] * 2) -> df1}
}
df1#       a b
#   <dbl> <chr>
# 1     2 a
# 2     4 b
# 3     6 c
# 4     8 d

批量替换tibble变量缺失值

上面解决了在mutate函数中动态引用变量,下面这个示例,对于数值类型缺失值用均值填充,字符类型使用众数函数填充。

library(pacman)
p_load(tidyverse)rv <- c(11, 18, 19, 21, 29, 46, 21)
rc <- c("a", "b", "c", "a", "d", "b", "e", "a", "c" )## 定义函数返回众数
imode <- function(v) {uniqv <- unique(v)uniqv[which.max(tabulate(match(v, uniqv)))]
}# imode(rv)
# imode(rc)df<-tibble(id=seq(1,10), ca=c(10,9,8,7,NA,NA,20,15,12,NA), cb=factor(c("A","B","A","A","","B","A","B","","A")),cc=factor(c("","BB","CC","BB","BB","CC","AA","BB","","AA")),cd=c(NA,20,18,22,18,17,19,NA,17,23))
# df## 动态获取变量值for (col in colnames(df)) {if (col %in% names(df[,sapply(df, is.numeric)])) {## 动态替换数值变量中NA值为均值df <- df  %>% mutate(!!col := replace(.data[[col]], is.na(.data[[col]]), mean(.data[[col]], na.rm=TRUE)) )# mutate(!!col := replace(!!rlang::sym(col), is.na(!!rlang::sym(col)), mean(.data[[col]], na.rm=TRUE)) )}else {## 动态替换字符变量中NA值为均值print(replace(.data[[col]], .data[[cols]]=="", imode(.data[[col]])))df <- df %>% mutate(!!col := replace(.data[[col]], .data[[col]]=="", imode(.data[[col]])))# mutate(!!col := replace(!!(rlang::sym(col)), !!rlang::sym(col)=="", imode(!!rlang::sym(col))) )}
}df
#       id    ca cb    cc       cd
#    <dbl> <dbl> <fct> <fct> <dbl>
#  1     1  10   A     BB     19.2
#  2     2   9   B     BB     20
#  3     3   8   A     CC     18
#  4     4   7   A     BB     22
#  5     5  11.6 A     BB     18
#  6     6  11.6 B     CC     17
#  7     7  20   A     AA     19
#  8     8  15   B     BB     19.2
#  9     9  12   A     BB     17
# 10    10  11.6 A     AA     23

上面代码有几点解释下:

  • colnames函数返回数据集的变量名称集合;names 函数功能类似,最大区别是前者只能用于而为数据结构,如矩阵、数据框,而names只能用于数据框;另外names可用于vector,colnames用于vector返回NULL。

  • sapply(df, is.numeric) 返回 df 中所有数值类型的变量。

  • dplyr包可使用:= 符号给动态变量赋值。

R 填充数据集中的缺失值相关推荐

  1. R语言把dataframe数据转化为tibble格式、查看每个数据列的缺失值个数、使用数据列的均值对数据列的缺失值进行填充

    R语言把dataframe数据转化为tibble格式.查看每个数据列的缺失值个数.使用数据列的均值对数据列的缺失值进行填充 目录

  2. R语言使用xgboost构建回归模型:vtreat包为xgboost回归模型进行数据预处理(缺失值填充、缺失值标识、离散变量独热onehot编码)、构建出生体重的xgboost模型回归模型

    R语言使用xgboost构建回归模型:vtreat包为xgboost回归模型进行数据预处理(缺失值填充.缺失值标识.离散变量独热onehot编码).构建出生体重的xgboost模型回归模型 目录

  3. R语言数据缺失值处理(随机森林,多重插补)

    缺失值是指数据由于种种因素导致的数据不完整,可以分为机械原因和人为原因.对于缺失值我们通常采用以下几种方法来进行插补. 1.读取数据 通过read.csv函数导入文档,也可以用其他函数读入,如open ...

  4. R语言ggplot2可视化:计算dataframe中每个数据列缺失值的个数、使用堆叠的条形图(Stacked Barplot)可视化每个数据列的缺失值的情况(自定义堆叠条形图的形式)

    R语言ggplot2可视化:计算dataframe中每个数据列缺失值的个数.使用堆叠的条形图(Stacked Barplot)可视化每个数据列的缺失值的情况(自定义堆叠条形图的形式) 目录

  5. 机器学习数据预处理之缺失值:预测填充(回归模型填充、分类模型填充)

    机器学习数据预处理之缺失值:预测填充(回归模型填充.分类模型填充) garbage in, garbage out. 没有高质量的数据,就没有高质量的数据挖掘结果,数据值缺失是数据分析中经常遇到的问题 ...

  6. 机器学习数据预处理之缺失值:插值法填充+ lagrange插值+拉格朗日插值

    机器学习数据预处理之缺失值:插值法填充+ lagrange插值+拉格朗日插值 garbage in, garbage out. 没有高质量的数据,就没有高质量的数据挖掘结果,数据值缺失是数据分析中经常 ...

  7. 机器学习数据预处理之缺失值:插值法填充+多项式插值

    机器学习数据预处理之缺失值:插值法填充+多项式插值 garbage in, garbage out. 没有高质量的数据,就没有高质量的数据挖掘结果,数据值缺失是数据分析中经常遇到的问题之一.当缺失比例 ...

  8. 机器学习数据预处理之缺失值:众数(mode)填充

    机器学习数据预处理之缺失值:众数(mode)填充 garbage in, garbage out. 没有高质量的数据,就没有高质量的数据挖掘结果,数据值缺失是数据分析中经常遇到的问题之一.当缺失比例很 ...

  9. 机器学习数据预处理之缺失值:最小值最大值填充

    机器学习数据预处理之缺失值:最小值最大值填充 garbage in, garbage out. 没有高质量的数据,就没有高质量的数据挖掘结果,数据值缺失是数据分析中经常遇到的问题之一.当缺失比例很小时 ...

最新文章

  1. linux 下面安装mysql
  2. .NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper
  3. 编程5年了,养成的臭脾气
  4. jfinal使用render之后还会继续往下执行代码吗
  5. VLAN基本通信原理
  6. php session有什么用,session有什么作用?
  7. 【杂项】2020年年度报告
  8. CUDA编程之:Stream(流)
  9. 使用gogs搭建git私有仓库
  10. 把复杂变简单,能产生颠覆的力量
  11. Oracle 11.2.0.4.0 Dataguard部署和日常维护(6)-Active Dataguard篇
  12. 手机群控还有这种事半功倍的操作?快来看强大的Rest API脚本功能
  13. 0ctf writeup
  14. Ehcache配置详解及CacheManager使用
  15. [SDOI2015] 星际战争
  16. 刷机:酷比魔方iwork8 刷回双系统
  17. CAD、3dmax等Autodesk系列软件安装报错1603解决办法
  18. Java 银联云闪付对接记录
  19. 淘宝店铺有点击没转化?做好这几点带你提升转化率
  20. 构建MFS+Keepalived双机高可用热备方案`

热门文章

  1. 如何安装虚拟机———一台电脑,多个系统体验
  2. 2020到2021计算机试题,2020广东计算机一级考试试题和答案【2021年整理】-20210715002405.docx-原创力文档...
  3. 台式机安装centos7系统
  4. 英语 Yang liang 120 --180
  5. /bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
  6. R 运行中文文件使乱码的解决方案(案例示例)
  7. 基于MATLAB的HSV颜色模型烟雾识别仿真
  8. Tableau:如何添加参考线、趋势线、参考区间、分布区间、盒须图?
  9. 怎样下载谷歌最新版100.0.4896.127chromedriver
  10. 遇见你是我最美的意外