使用最近的日期创建新列

时间:2018-03-07 11:17:08

标签: r date data.table

我在data.table中遇到的数据集有些问题。基本上,我有 2列:预定交货日期和重新安排的交货日期。然而, 有些值留空。一个例子:

Scheduled        Rescheduled
NA               NA
2016-11-14       2016-11-17
2016-11-15       NA
2016-11-13       2016-11-11
NA               2016-11-15

我想创建一个新列,表示最新的列 两列的日期,例如名为max_scheduled_date。 因此,如果Rescheduled为NA,则max_scheduled_date应为 取Scheduled的值max_scheduled_dateRescheduled 如果Scheduled为NA,则取max_scheduled_date的值。当两个 列是NA,List<String> strings = List.of("abc","123","zzz"); 显然应该采用NA。 如果两列都有日期,则应采用最新的日期。 我在创建这个问题时遇到了很多问题而且没有得到我想要的结果。

日期是POSIXct,遗憾的是这给我带来了一些麻烦。

有人可以帮帮我吗? 先感谢您, 亲切的问候, 阿曼达

2 个答案:

答案 0 :(得分:0)

假设两列都是Date类,我们可以使用pmax创建每行的最大日期

df1[] <- lapply(df1, as.Date) #change to Date class initially
df1$max_scheduled_date <- do.call(pmax, c(df1, na.rm = TRUE))
df1$max_scheduled_date
#[1] NA           "2016-11-17" "2016-11-15" "2016-11-13" "2016-11-15"

也可以使用tidyverse

来完成
library(dplyr)
df1 %>%
    mutate_all(as.Date) %>%
    mutate(max_scheduled_date = pmax(Scheduled, Rescheduled, na.rm = TRUE))

答案 1 :(得分:0)

由于问题标有data.table,因此这里也是data.table解决方案。

pmax()似乎与POSIXct充分合作。因此,我认为没有理由强制从POSIXctDate类的日期列。

setDT(DF)[, max_scheduled_date := pmax(Scheduled, Rescheduled, na.rm = TRUE)]
DF
    Scheduled Rescheduled max_scheduled_date
1:       <NA>        <NA>               <NA>
2: 2016-11-14  2016-11-17         2016-11-17
3: 2016-11-15        <NA>         2016-11-15
4: 2016-11-13  2016-11-11         2016-11-13
5:       <NA>  2016-11-15         2016-11-15

请注意,新列通过引用附加,即不复制整个对象。

数据

DF <- setDF(fread(
  "Scheduled        Rescheduled
NA               NA
2016-11-14       2016-11-17
2016-11-15       NA
2016-11-13       2016-11-11
NA               2016-11-15"
)[, lapply(.SD, as.POSIXct)])
str(DF)
'data.frame': 5 obs. of  2 variables:
 $ Scheduled  : POSIXct, format: NA "2016-11-14" "2016-11-15" ...
 $ Rescheduled: POSIXct, format: NA "2016-11-17" NA ...