本篇分享一个处理技巧,也来自一位读者的咨询。示例数据如下所示(可在后台回复关键词示例数据获得)。

A2000-A2020五列为日期格式,其中包含缺失值;Year为某事件发生的年份。要求生成两列数据:

  • 第一列为事件发生的具体日期,也就是变量Year中的年份所对应前五列中的日期。如第一行对应的就是A2015列中的日期,第二行对应的是A2020列中的日期;

  • 第二列为发生日期之前的第一个非缺失日期。如第一行为A2010列的日期,第二行本应该是A2015列的日期,但是该列为缺失值,因此递补为A2010列的日期。

导入数据

test <- read.csv("104.缺失值test.csv",stringsAsFactors = F,na.strings = "",fileEncoding = "UTF-8-BOM")

此步实际的参数功能如下:

  • stringsAsFactors = F:默认状态下,read.csv()函数会把字符变量当作是因子变量,该语句可避免这一情况;

  • na.strings = "":将空字符串(即"")当作是缺失值;

  • fileEncoding = "UTF-8-BOM":防止列名乱码。

  • 读者可分别去掉相应语句比较数据导入的效果。

转换日期格式

将前五列转为日期格式:

library(magrittr)
library(tidyverse)
test %<>%mutate(across(starts_with("A"),as.Date))

这里使用的across()函数是一个批量处理函数,可以参见以下两篇推文:

  • dplyr | 提高数据处理效率!数据框的colwise和rowwise操作

  • 技巧 | 如何批量地将整型变量转换为因子变量

生成第一个变量

生成第一个变量的思路比较简单,只需要根据Year中的年份提取相应列中的数据即可。直接的方法是使用多层的if语句,不过dplyr工具包提供了一个更快捷的函数case_when()

test %<>%mutate(t1 = case_when(Year == "2020"~A2020,Year == "2015"~A2015,Year == "2010"~A2010,Year == "2005"~A2005,))

生成第二个变量

相比之下,生成第二个变量的思路就不那么简单了,即使想使用if语句其逻辑也不是那么清晰。

小编的解决思路如下:

首先是把Year对应年份及其之后的日期全部转为缺失值。

为了不污染原始数据,这里使用一个临时数据框test0:

test0 = test
test0$A2020 = NA
test0$A2015[test0$Year <= 2015] = NA
test0$A2010[test0$Year <= 2010] = NA
test0$A2005[test0$Year <= 2005] = NA

此时,test0中各行最大的一个日期即为所求的第二个变量。

小编不清楚日期怎么比较大小,因此先将它们转为数值变量,方法同上:

test0 %<>%mutate(across(starts_with("A"),as.numeric))

max()函数可以用于求最大值:

test0 %<>%mutate(t2 = max(A2015, A2010, A2005, A2000,na.rm = T))
  • na.rm = T:设置缺失值不参与计算。

可以发现,上面代码计算的变量所有行的数值都是一样的,因为它是针对所有的数值求最大值的,这与预期目标不符。为了能够按行求最大值,需要在其在其使用rowwise()函数:

test0 %<>%rowwise() %>%mutate(t2 = max(A2015, A2010, A2005, A2000,na.rm = T))

再把数值变量转为日期变量:

test$t2 <- as.Date(test0$t2, origin = "1970-1-1")
  • R中默认1970年1月1日对应的数值为0。

需要示例数据请在后台回复关键词示例数据

技巧 | 数据有缺失值情况下的一个处理方法相关推荐

  1. 在数据仓储的情况下进一步封装数据库基础操作,此版本为异步版本

    1 /// <summary> 2 /// 在数据仓储的情况下进一步封装数据库基础操作,此版本为异步版本 Created by ZhangQC 2016.08.17 3 /// </ ...

  2. java中数组的内存模型_Java如何在内存有限的情况下实现一个超大数组?jvm性能调优+内存模型+虚拟机原理能解决什么样问题...

    在上一篇文章中,小编为您详细介绍了关于<变频器调速问题?三星R458更换CPU>相关知识.本篇中小编将再为您讲解标题Java如何在内存有限的情况下实现一个超大数组?jvm性能调优+内存模型 ...

  3. 如何在完全不懂服务器开发的情况下做一个实时联网对战的微信小游戏

    微信小游戏即将开放?有我们在,你还赶得上! 根据微信官方对外公开的消息,微信小游戏的脚步越来越接近了.它的开发者资格门槛和使用者门槛都很低,以后必将引爆一波"全民开发小游戏"浪潮. ...

  4. 滤了asa,cer,cdx,php,aspx等脚本类型的上传情况下添加一个ashx的上传类型

    今天日一站 发现后台可以设置上传类型,但是asp,asa,cer等等都不行,上传之后就提示下载 尝试着关闭了下了,还是不行,后来找到了一位前辈写的文章 过滤了asa,cer,cdx,php,aspx等 ...

  5. python设计一个节假日字典_python实现在无须过多援引的情况下创建字典的方法

    本文实例讲述了python实现在无须过多援引的情况下创建字典的方法.分享给大家供大家参考.具体实现方法如下: 1.使用itertools模块 import itertools the_key = [' ...

  6. 有10个站连接到以太网上。试计算一下三种情况下每一个站所能得到的带宽。

    问题 有10个站连接到以太网上.试计算一下三种情况下每一个站所能得到的带宽. (1)10个站都连接到一个10Mb/s以太网集线器: (2)10个站都连接到一个100Mb/s以太网集线器: (3)10个 ...

  7. 百面机器学习 -- No.2 特征工程 -- 训练数据不足的情况下会带来什么问题,如何缓解?

    训练数据不足的情况下会带来什么问题,如何缓解? 数据不足会带来什么问题 如何解决 ? 数据不足会带来什么问题 机器学习任务的问题,可以简单的理解成寻找最佳的拟合函数和最佳的泛化函数,拟合函数是用来学习 ...

  8. [css] 写出div在不固定高度的情况下水平垂直居中的方法?

    [css] 写出div在不固定高度的情况下水平垂直居中的方法? 我知道的有两种方法<!DOCTYPE html> <html><head><meta char ...

  9. [css] 写出在不固定宽高的元素在固定高度的情况下水平垂直居中的方法

    [css] 写出在不固定宽高的元素在固定高度的情况下水平垂直居中的方法 flex布局:还有就是可以用定位也可以实现等等: flex:父div:{display:flex: justify-conten ...

最新文章

  1. 关于学习Python的一点学习总结(58->匹配对象和编组)
  2. 用纸筒做机器人_幼儿园简单手工:纸盒子回收利用做机器人(步骤图解)
  3. 平安 开源 数据库 实践_刻意的实践-成为开源
  4. 【RUST官方语言中文翻译】前言
  5. axure侧弹层遮罩_Axure教程 带遮罩层的弹出框(9)
  6. Ajax跨域请求以及乱码解决
  7. linux中paste的用法,在Linux中使用Paste命令来合并行,包括使用Paste命令技巧及注意事项...
  8. (75)Verilog HDL系统函数和任务:$readmemh
  9. 冠军轮流转:Q3 季苹果超越小米,回到全球最大的可穿戴设备厂商宝座
  10. vue打开html自动加载js,vue.js怎么实现懒加载
  11. 旋度的散度为零证明_(大牛分享)实列讲解:Python Sympy计算梯度、散度和旋度...
  12. 使用GDI绘制一个类似进度条的控件(1)
  13. 产生唯一的id(idworker工具类)
  14. EL表达式与Jstl标签库学习
  15. Verilog中按键消抖检测的实现
  16. 2509 Problem H:奇怪的分式
  17. java example使用_关于通用 Mapper Example 使用记录
  18. 2021年Java工程师飞升成神之路
  19. 一种为MP3生成字幕文件的方法
  20. 【Try to Hack】fiddler

热门文章

  1. 使用vSphere Web Client导出/导入/还原分布式交换机配置(2034602)
  2. Java基础学习总结(86)——Java异常处理机制Exception抛出异常时throw和throws用法详解
  3. Java基础学习总结(68)——有关Java线程方面的面试题
  4. render在python中的含义_python面试中常见易混淆概念
  5. python基础数据类型操作系统_python基础数据类型
  6. 要么出色,要么出局!威马公布三大核心技术矩阵背后的大野心
  7. Centos6.5使用yum安装mysql——快速上手必备
  8. 新零售大潮下 联想与BHG Mall签约共建智慧商城
  9. MongoDB(1)--简单介绍以及安装
  10. Git添加多个SSH key公钥