为最大日期选择列名称

Picking out column name for maximum dates

我有一个数据集,它是多年来对个人的跟进。因此,我有事件发生的日期列表。我复制了一个数据样本(这里只有 2 个日期,但在我的实际数据中有更多列)。我想 select 最大日期和该日期来自的列。我已经使用其他软件完成了此操作,但需要在 R 中完成,但我不确定如何进行。

我已经设法获得个人的最大日期,但是我没有设法获得此数据来自的列。

我用它来获取最大日期

apply(testdata[], 1, max, na.rm=T)

我已尝试执行以下操作以及无效操作的变体

colnames(testdata)[apply(testdata[], 1, which.max)]

但是上面什么都没有return。我知道这是因为日期是 S3 class 并且 which.max 似乎不适用于 class。

我发现 问题是这是针对单个数据的,我尝试使用

colnames(testdata)[apply(as.POSIXct(testdata[]),1,which.max]

但这会产生错误。

因此,我不确定如何获取列名。有任何想法吗?

最终结果应如下所示:

date1            date2  ID  Maximumdate columnName
09/09/2016  09/09/2016  27  09/09/2016  date2
13/09/2016              28  13/09/2016  date1
14/09/2016  15/09/2016  29  15/09/2016  date2
16/09/2016  16/09/2016  30  16/09/2016  date2
29/09/2016  20/09/2016  31  29/09/2016  date1
06/10/2016  30/09/2016  32  06/10/2016  date1



如果将日期列转换为数字矩阵,则可以使用 max.col 到 return 达到最大值的列的索引。在转换为数字时,我将 NA 标记为负无穷大,因此它们不会被选为最大值,以匹配您的第 2 行结果。

j <- max.col(sapply(df[1:2], function(x) ifelse(is.na(x), -Inf, as.numeric(x))))
df$Maximumdate <- df[cbind(seq(nrow(df)), j)]
df$columnName <- names(df)[j]

df
#        date1      date2 ID Maximumdate columnName
# 1 2016-09-09 2016-09-09 27  2016-09-09      date2
# 2 2016-09-13       <NA> 28  2016-09-13      date1
# 3 2016-09-14 2016-09-15 29  2016-09-15      date2
# 4 2016-09-16 2016-09-16 30  2016-09-16      date1
# 5 2016-09-29 2016-09-20 31  2016-09-29      date1
# 6 2016-10-06 2016-09-30 32  2016-10-06      date1

使用的数据如下。如果日期列实际上不是日期而是字符串,您需要 运行 下面代码的第二部分将它们转换为日期。

df <- data.table::fread('
date1            date2  ID  Maximumdate columnName
09/09/2016  09/09/2016  27  09/09/2016  date2
13/09/2016  NA          28  13/09/2016  date1
14/09/2016  15/09/2016  29  15/09/2016  date2
16/09/2016  16/09/2016  30  16/09/2016  date2
29/09/2016  20/09/2016  31  29/09/2016  date1
06/10/2016  30/09/2016  32  06/10/2016  date1
', data.table = F)

df[1:2] <- lapply(df[1:2], as.Date, format = '%d/%m/%Y')

我们用 pmax 得到 'Maximumdate' ,用 pmap

遍历行得到 'columnName'
library(tidyverse)
library(lubridate)
df %>%
   mutate_at(vars(starts_with('date')), dmy) %>% 
   mutate(Maximumdate = pmax(date1, date2, na.rm = TRUE), 
   columnName = pmap(.[1:2], ~ names(which.max(rev(c(...))))))
#      date1      date2 Maximumdate columnName
#1 2016-09-09 2016-09-09  2016-09-09      date2
#2 2016-09-13       <NA>  2016-09-13      date1
#3 2016-09-14 2016-09-15  2016-09-15      date2
#4 2016-09-16 2016-09-16  2016-09-16      date2
#5 2016-09-29 2016-09-20  2016-09-29      date1
#6 2016-10-06 2016-09-30  2016-10-06      date1

数据

df <- structure(list(date1 = c("09/09/2016", "13/09/2016", "14/09/2016", 
"16/09/2016", "29/09/2016", "06/10/2016"), date2 = c("09/09/2016", 
NA, "15/09/2016", "16/09/2016", "20/09/2016", "30/09/2016")),
row.names = c(NA, 
-6L), class = "data.frame")