【问题标题】:replacing NA groping by id and computing the latest date - R用 id 替换 NA 摸索并计算最新日期 - R
【发布时间】:2019-07-08 14:23:11
【问题描述】:

我有这个df

            id       date
230       1066 2018-01-22
231       1066 2018-01-26
232       1066 2018-01-21
233       1066 2018-01-20
234       1066 2018-01-18
235       1066 2018-01-19
236       1066 2018-01-22
237       1017       <NA>
238       1017 2018-03-09
239       1017       <NA>
240       1017       <NA>
241       1017       <NA>
242       1017 2018-05-16
243       1017 2018-05-16
244       1017 2018-03-29
245       1017 2018-05-16
246       1017 2018-05-16
247       1017       <NA>
248       1017       <NA>
249        442 2018-05-20
250        442 2018-05-17

在给定最新日期的情况下,我需要按 id 对它们进行分组,但是当该组有 NA 时,它将给出 NA 而不是最新日期(最大值)值:

aggregate(df$date, by=list(df$id), max)

76     1066 2018-04-09
77     1017       <NA>
78      442 2018-05-20

我正在想办法替换它们。我试图用 0 替换它们(因为我正在寻找最大值):

df[is.na(df$date),c("date")] <- 0

但它给了我这个错误:

Error in as.Date.numeric(value) : 'origin' must be supplied

而且我不想将日期更改为数字,因为在此之后(当每个 id 只有一个日期时)我需要提取每个 id 的月份和年份来进行一些条件计算。最后一个非常简单,使用来自lubridatemonth()year()

【问题讨论】:

  • na.rm 参数为 max aggregate(df$date, by=list(df$id), max, na.rm = TRUE)
  • 你不能。如果您坚持将结果保留为 Date 类对象,则没有有效的“0”值。
  • 如果是将NA替换为max date,则library(dplyr); df %&gt;% group_by(id) %&gt;% mutate(date = zoo::na.aggregate(date, max, na.rm = FALSE))
  • @42- 我不需要用“0”值替换它们。我只需要用一些东西替换 NA 或试图找出一种忽略它们的方法,以获得每个 id 的最新日期。
  • 如果您要指定一个有效的日期,那么您可以使用[.Date&lt;- 分配给它。我不知道为什么 akrun 建议使用 dplyr 转换为 POSIXct,因为问题涉及 Date 分类向量。

标签: r date group-by nan


【解决方案1】:
library(tidyr)
library(dplyr)
library(lubridate)
df %>% mutate(date = ymd(date)) %>% group_by(id)  %>% summarize(max(date,na.rm = T))

# A tibble: 3 x 2
     id `max(date, na.rm = T)`
  <int>                 <date>
1   442             2018-05-20
2  1017             2018-05-16
3  1066             2018-01-26

【讨论】:

    猜你喜欢
    • 2018-06-07
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 2020-09-08
    • 2011-12-05
    相关资源
    最近更新 更多