gpt4 book ai didi

r - R 中带有 NA 的日期列 - 变异的意外行为

转载 作者:行者123 更新时间:2023-12-04 10:37:45 24 4
gpt4 key购买 nike

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

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等等。

让我们首先从数据开始。

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)

第 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>

这里的一切都符合预期。

第 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当组中没有其他日期时。

第 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 步中我们收到了一条警告消息。

Warning messages: 1: In min.default(c(NA_real_, NA_real_), na.rm = TRUE) : no non-missing arguments to min; returning Inf 2: In min.default(NA_real_, na.rm = TRUE) : no non-missing arguments to min; returning Inf



因为我们在一个组中没有非 NA 值,所以它返回 Inf即使 df2 的输出显示 NA(为什么在值为 NA 时显示 Inf 在答案末尾添加了解释)。所以即使你测试 is.na有了它,它就失败了。
is.na(df2$orderdate_dried)
#[1] FALSE FALSE FALSE

因此, maxna.rm也失败了。
 max(df2$orderdate_dried, na.rm = TRUE)
#[1] NA

因此,您将获得所有 NA s 在步骤 3 中。

解决方案

解决方法是查看 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

Warning message: In min(NA, na.rm = TRUE) : no non-missing arguments to min; returning Inf



这将返回 Inf我们收到警告。

但是,由于我们知道一列只能容纳一个值 class .
class(Inf) #is
#[1] "numeric"

但是我们在 df1 中有“Date”类的数据的 orderdate_dried柱子
 class(df1$orderdate_dried)
#[1] "Date"

所以 Inf然后被强制进入返回的类“Date”。
as.Date(min(NA, na.rm = TRUE))
#[1] NA

这又是返回 NA但它不是真的 NAis.na失败了
is.na(as.Date(min(NA, na.rm = TRUE)))
#[1] FALSE

因此,第 3 步没有按预期工作。

我希望这个答案是明确的,不要太困惑。

关于r - R 中带有 NA 的日期列 - 变异的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60632568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com