R 中带有 NA 的日期列 - mutate 的意外行为

2024-02-02

我正在尝试使用数据集来遵循这个过程。 这是一个测试数据框:

id <- c("Johnboy","Johnboy","Johnboy")
orderno <- c(2,2,1)
validorder <- c(0,1,1)
ordertype <- c(95,94,95)
orderdate <- as.Date(c("2019-06-17","2019-03-26","2018-08-23"))

df <- data.frame(id, orderno, validorder, ordertype, orderdate)

然后我执行以下操作:

## compute order date for order types
df <- df %>%
  mutate(orderdate_dried = if_else(validorder == 1 &
                                  ordertype == 95,
                                  orderdate, as.Date(NA)),
         orderdate_fresh = if_else(validorder == 1 &
                                  ordertype == 94,
                                  orderdate, as.Date(NA)))

## take minimum order date by type by order number
df <- df %>%
  group_by(id, orderno) %>%
  mutate(orderdate_dried = min(orderdate_dried, na.rm = TRUE),
         orderdate_fresh = min(orderdate_fresh, na.rm = TRUE)) %>%
  ungroup()

## aggregate order date for each type over individual
df <- df %>%
  group_by(id) %>%
  mutate(max_orderdate_dried = max(orderdate_dried, na.rm=TRUE),
         max_orderdate_fresh = max(orderdate_fresh, na.rm=TRUE)) %>%
  ungroup()

但此过程结束时的所有最长日期均不适用!我不明白怎么办?此外,如果我测试原始的orderdate_dried对于 NA:

is.na(df$orderdate_dried)

我每行都得到 NA!这是怎么回事?!


非常有趣的问题,答案隐藏在问题本身中。为了清楚起见,而不是更新相同的内容df每次我都会使用df1, df2 etc.

我们首先从数据开始。

id <- c("Johnboy","Johnboy","Johnboy")
orderno <- c(2,2,1)
validorder <- c(0,1,1)
ordertype <- c(95,94,95)
orderdate <- as.Date(c("2019-06-17","2019-03-26","2018-08-23"))

df <- data.frame(id, orderno, validorder, ordertype, orderdate)

library(dplyr)

Step 1 -

df1 <- df %>%
        mutate(orderdate_dried = if_else(validorder == 1 &
                                         ordertype == 95,
                                        orderdate, as.Date(NA)),
               orderdate_fresh = if_else(validorder == 1 &
                                         ordertype == 94,
                                         orderdate, as.Date(NA)))

df1
#       id orderno validorder ordertype  orderdate orderdate_dried orderdate_fresh
#1 Johnboy       2          0        95 2019-06-17            <NA>            <NA>
#2 Johnboy       2          1        94 2019-03-26            <NA>      2019-03-26
#3 Johnboy       1          1        95 2018-08-23      2018-08-23            <NA>

这里一切都如预期。

Step 2 -

df2 <- df1 %>%
        group_by(id, orderno) %>%
        mutate(orderdate_dried = min(orderdate_dried, na.rm = TRUE),
                orderdate_fresh = min(orderdate_fresh, na.rm = TRUE)) %>%
        ungroup()

df2
# A tibble: 3 x 7
#  id      orderno validorder ordertype orderdate  orderdate_dried orderdate_fresh
#  <fct>     <dbl>      <dbl>     <dbl> <date>     <date>          <date>         
#1 Johnboy       2          0        95 2019-06-17 NA              2019-03-26     
#2 Johnboy       2          1        94 2019-03-26 NA              2019-03-26     
#3 Johnboy       1          1        95 2018-08-23 2018-08-23      NA           

这里的一切似乎也都符合预期,我们得到NA当组中没有其他日期时。

Step 3 -

df3 <- df2 %>%
        group_by(id) %>%
        mutate(max_orderdate_dried = max(orderdate_dried, na.rm=TRUE),
               max_orderdate_fresh = max(orderdate_fresh, na.rm=TRUE)) %>%
         ungroup()

df3
# A tibble: 3 x 9
#  id      orderno validorder ordertype orderdate  orderdate_dried orderdate_fresh max_orderdate_dried max_orderdate_fresh
 #  <fct>     <dbl>      <dbl>     <dbl> <date>     <date>          <date>          <date>              <date>             
#1 Johnboy       2          0        95 2019-06-17 NA              2019-03-26      NA                  NA                 
#2 Johnboy       2          1        94 2019-03-26 NA              2019-03-26      NA                  NA                 
#3 Johnboy       1          1        95 2018-08-23 2018-08-23      NA              NA                  NA    

这里一切似乎都不对劲。这些基本上与您执行的步骤相同,并且这与您获得的输出相同,因此直到这里我们还没有做任何不同的事情。

但我们错过的一件事是在第 2 步中我们收到了一条警告消息。

警告消息: 1:在 min.default(c(NA_real_, NA_real_), na.rm = TRUE) 中: min 没有非缺失参数;返回信息 2:在 min.default(NA_real_, na.rm = TRUE) 中: min 没有非缺失参数;返回信息

因为我们在返回的组中没有非 NA 值Inf即使输出df2显示 NA (为什么它显示NA当值为Inf在答案末尾添加了对此的解释)。所以即使你测试is.na有了它,它就失败了。

is.na(df2$orderdate_dried)
#[1] FALSE FALSE FALSE

Hence, max with na.rm也失败了。

 max(df2$orderdate_dried, na.rm = TRUE)
#[1] NA

因此,你得到了所有NA步骤 3 中的 s。


Solution

解决方案是检查is.finite

df3 <- df2 %>%
        group_by(id) %>%
         mutate(max_orderdate_dried = max(orderdate_dried[is.finite(orderdate_dried)], na.rm=TRUE),
                 max_orderdate_fresh = max(orderdate_fresh[is.finite(orderdate_fresh)], na.rm=TRUE)) %>%
         ungroup()


df3
# A tibble: 3 x 9
#  id      orderno validorder ordertype orderdate  orderdate_dried orderdate_fresh max_orderdate_dried max_orderdate_fresh
#  <fct>     <dbl>      <dbl>     <dbl> <date>     <date>          <date>          <date>              <date>             
#1 Johnboy       2          0        95 2019-06-17 NA              2019-03-26      2018-08-23          2019-03-26         
#2 Johnboy       2          1        94 2019-03-26 NA              2019-03-26      2018-08-23          2019-03-26         
#3 Johnboy       1          1        95 2018-08-23 2018-08-23      NA              2018-08-23          2019-03-26   

为什么它的值显示为NA当值为Inf ?

在第2步中,我们基本上做的是

min(NA, na.rm = TRUE)
#[1] Inf

警告信息: 在 min(NA, na.rm = TRUE) 中:min 没有非缺失参数;返回信息

这返回Inf我们收到一个警告。

但是,由于我们知道一列只能保存一个值class.

class(Inf) #is
#[1] "numeric"

但我们有“日期”类的数据df1's orderdate_dried column

 class(df1$orderdate_dried)
#[1] "Date"

so Inf然后被强制进入返回的“Date”类。

as.Date(min(NA, na.rm = TRUE))
#[1] NA

这又是回报NA但这不是真的NA and is.na在此失败

is.na(as.Date(min(NA, na.rm = TRUE)))
#[1] FALSE

因此,步骤 3 无法按预期工作。

我希望这个答案是清楚的,不要太混乱。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R 中带有 NA 的日期列 - mutate 的意外行为 的相关文章

  • 将值添加到 R 中 for 循环内的向量

    我刚刚开始学习 R 我编写了这段代码来学习函数和循环 squared lt function x m lt c for i in 1 x y lt i i c m y return m squared 5 NULL 为什么这个返回NULL
  • 在 R 中使用两个 for 循环创建矩阵/数据框

    这是我在 SO 上的第一篇文章 所以请友善 我的问题与这个问题隐约相关 R中的双for循环创建矩阵 https stackoverflow com questions 44376020 double for loop in r creati
  • 如何找到对象的创建位置?

    我目前正在努力改进对其他脚本有不同调用的代码 我想知道在哪里创建对象 对于其中一些人来说 只需使用文本编辑器的搜索选项即可 只要看看是否obj lt or obj 有什么结果 但这不适用于使用assign功能 在加载的脚本中创建的也不是 T
  • lme4:如何指定 2 个与随机截距的相关性,而不添加随机斜率之间的相关性

    重新发布自stats stackexchange com https stats stackexchange com q 195385 33560 我试图在 R 的 lme4 包中指定一个模型 其中随机截距和随机斜率之间有 2 个相关性 但
  • 将线条剪裁到绘图区域并在绘图区域外显示文本

    我想限制绘图的可见 y 范围 为了保留超出此范围的值 我需要设置oob 出界 to rescale none这效果很好 不过 我还想在图外的页边空白处添加一些文本 为了做到这一点 我需要关闭剪辑 这会导致超出范围的值被绘制在绘图区域之外的边
  • 在 R/ggplot2 中将字符串转换为函数参数的最佳方法? [复制]

    这个问题在这里已经有答案了 我正在开发一个闪亮的应用程序 用户可以选择可以使用 ggplot2 绘制哪些变量 但是我完全不确定将字符串 即要绘制的变量的名称 转换为合适的函数参数的最佳方法 考虑以下非常人为的 有效的示例 df lt dat
  • 匹配向量内的向量

    I have vec1 lt c 0 0 0 1 1 0 1 1 1 0 0 1 vec2 lt c 1 1 我预计 magicFUN x vec1 y vec2 1 4 7 8 这意味着我想要一个完整向量在另一个向量内的位置 match
  • 如何规划庭院灯最有效的路线

    我正在尝试挂一些庭院灯 基于另一个问题 https cs stackexchange com questions 80134 christmas light route efficiency我问 我意识到我需要一种算法来解决路由检查问题 h
  • 使用 roxygen2 记录数据集

    我正在尝试使用 roxygen2 记录 R 包中的一些数据集 仅考虑其中之一 I have mypkg data CpG human GRCh37 RDa 其中包含一个名为的对象CpG human GRCh37 和一个名为 mypkg R
  • R 中的 For 循环分配给数据框

    运行 for 循环后 我在分配给数据帧时遇到问题 当我使用 print 时 它给出了我的价值 有什么解释吗 salesdate lt rep seq from as Date 2013 12 19 to as Date 2013 12 23
  • 如何在闪亮的应用程序中显示矩阵,并用条件指定颜色?

    我有一个具有正值和负值的矩阵 M 我正在尝试使用 DT 包在闪亮的应用程序中显示为表格 我想用不同的颜色显示矩阵 红色的正数和负数 例如 到目前为止 我只能以一对一的方式添加颜色 但我想以这种方式添加颜色 如果matrix values g
  • 为什么 quosures 在 group_by() 中起作用,但在 filter() 中不起作用?

    我正在构建一个函数 我将根据字符串操作数据框 在该函数中 我将根据字符串构建一个列名称 并使用它来操作数据框 如下所示 library dplyr orig df lt data frame id 1 3 amt c 100 200 300
  • R:使用 as.formula 修复模型中的模型调用

    我有一个gls模型 其中我将公式 来自另一个对象 分配给模型 equation lt as formula aic obj row model gt equation temp avg I year 1950 mod1 lt gls equ
  • 如何在shell脚本中运行R代码?

    我有一个 R 文件 myfile R 我想使用 shell 脚本来运行它 我怎样才能做到这一点 我试过这个 bin bash Rscript myfile R 但它给了我这个错误 Rscript 找不到命令 我也尝试过这个 bin bash
  • 在 R 中使用 ggplot2 叠加两个图

    有两个数据框 df1 df2我需要使用 ggplot2 创建线图并显示在同一个图表上 df1 x y 2 30 4 25 6 20 8 15 df2 x y 2 12 4 16 6 20 8 24 用于绘制第一个 df p1 lt ggpl
  • 在 R 中高效加载稀疏矩阵

    我在将数据有效加载到 R 中的稀疏矩阵格式时遇到问题 这是我当前策略的 不完整 示例 library Matrix a1 Matrix 0 5000 100000 sparse T for i in 1 5000 a1 i idxOfCol
  • R 中的频率加权,与 Stata 的结果比较

    我正在尝试分析明尼苏达大学 IPUMS 数据集中的数据1990 年美国人口普查 http usa ipums org usa sampdesc shtml us1990a in R 我正在使用survey http faculty wash
  • 如何将带有几行代码的字符数组转换为 data.frame?

    我有以下数组 my list lt c Jan 01 Dec 31 00 00 24 00 Jan 01 Jun 30 12 00 18 00 Jul 06 Dec 31 09 00 19 00 导致以下结果的最短代码是什么 x1 x2 x
  • 用于检查和批量线性模型的数据表选项

    我想知道是否有data table用于从数据集中批量处理线性模型并首先进行检查的选项 我需要对每个唯一标识符运行一堆线性模型 但首先我需要进行检查 对于每个唯一的 id 和年份 我需要检查是否有至少 24 个月的先前每月数据 但不超过 60
  • 修改x轴刻度标签

    我正在尝试更改由生成的箱线图的 x 轴刻度标签ggplot2 x 轴是一个分类变量 HabFac 我想要的是将其刻度更改为 6 个化学品 A E 下面是我的代码 raw data read table Read data p TT ggpl

随机推荐