Выбор названия столбца для максимальных дат - PullRequest
1 голос
/ 24 сентября 2019

У меня есть набор данных, который отслеживает людей в течение ряда лет.Таким образом, у меня есть список дат, когда произошли события.Я скопировал образец данных (здесь только 2 даты, но в моих реальных данных есть больше столбцов).Я хочу выбрать максимальную дату и столбец, из которого эта дата пришла.Я сделал это с помощью другого программного обеспечения, но мне нужно сделать это в R, и я не уверен, что делать дальше.

Мне удалось получить максимальную дату для человека, однако мне не удалось получить столбец, из которого получены эти данные.

Я использовал это, чтобы получить максимальную дату

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

Я пытался сделать следующее и варианты того, что не работает

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

Но выше ничего не вернулось.Я знаю, что это связано с тем, что даты относятся к классу S3 и что .max, похоже, не работает с этим классом.

Я нашел R: Как получить максимальное значение столбца datetime в данных временного ряда проблема в том, что это для отдельных данных, я пытался использовать

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



Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Мы получаем «Maximumdate» с pmax и «columnName», циклически перебирая строки с 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

data

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")
1 голос
/ 24 сентября 2019

Если вы преобразуете столбцы даты в числовую матрицу, вы можете использовать max.col, чтобы вернуть индекс столбца, который достигает максимального значения.При преобразовании в числовые значения я пометил 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...