Используя dplyr
, мы можем сначала преобразовать ColumnA
в POSIXct
формат, сгруппировать по дате, а затем назначить rank
в каждой группе.
library(dplyr)
df %>%
mutate(ColumnA = as.POSIXct(ColumnA, format = "%m/%d/%Y %H:%M", tz = "UTC")) %>%
#Can also use lubridate mdy_hm
#mutate(ColumnA = lubridate:: mdy_hm(ColumnA)) %>%
group_by(group = as.Date(ColumnA)) %>%
mutate(new_col = rank(ColumnA)) %>%
ungroup() %>%
select(-group)
# A tibble: 8 x 3
# ColumnA ColumnB new_col
# <dttm> <int> <dbl>
#1 2019-09-26 23:29:00 4 4
#2 2019-09-26 17:29:00 3 3
#3 2019-09-26 08:29:00 2 2
#4 2019-09-26 01:10:00 1 1
#5 2019-09-25 15:21:00 4 4
#6 2019-09-25 10:19:00 3 3
#7 2019-09-25 05:29:00 2 2
#8 2019-09-25 00:29:00 1 1
Сохранение обоих столбцов для сравнения.
Если строки всегда в порядке убывания, как указано в сообщении, мы также можем сделать
df %>%
mutate(ColumnA = as.POSIXct(ColumnA, format = "%m/%d/%Y %H:%M", tz = "UTC")) %>%
group_by(group = as.Date(ColumnA)) %>%
mutate(new_col = n() : 1)
#OR
#mutate(new_col = n() - row_number() + 1)
#OR
#mutate(new_col = order(ColumnA))
data
df <- structure(list(ColumnA = structure(c(7L, 6L, 8L, 5L, 3L, 2L,
4L, 1L), .Label = c("9/25/2019 0:29", "9/25/2019 10:19", "9/25/2019 15:21",
"9/25/2019 5:29", "9/26/2019 1:10", "9/26/2019 17:29", "9/26/2019 23:29",
"9/26/2019 8:29"), class = "factor"), ColumnB = c(4L, 3L, 2L, 1L, 4L, 3