为最大日期选择列名称
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")
我有一个数据集,它是多年来对个人的跟进。因此,我有事件发生的日期列表。我复制了一个数据样本(这里只有 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
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")