функция для повторения вхождений метки времени в столбце по дням - PullRequest
1 голос
/ 05 октября 2019

У меня есть набор данных в R, отсортированный по убыванию по метке времени в столбце A (мм / дд / гггг чч: мм 24 ч). Я рассчитываю создать в столбце B текущее количество меток времени в столбце A, происходящих с полуночи для каждого уникального дня. Я хотел бы получить следующий результат ниже:

Пример:

| Column A        | Column B |
|-----------------|----------|
| 9/26/2019 23:29 | 4        |
| 9/26/2019 17:29 | 3        |
| 9/26/2019 8:29  | 2        |
| 9/26/2019 1:10  | 1        |
| 9/25/2019 15:21 | 4        |
| 9/25/2019 10:19 | 3        |
| 9/25/2019 5:29  | 2        |
| 9/25/2019 0:29  | 1        |

Я решил эту проблему в Excel с помощью функции счетчика для уникального значения мм / дд / гггг в столбце АМне не удалось найти эквивалент R.

Ответы [ 2 ]

2 голосов
/ 05 октября 2019

Предполагая, что ввод, показанный в воспроизводимой форме в примечании в конце, создает версию столбца POSIXct A в A, а затем вычисляет rank в Date, используя ave. Пакеты не используются.

A <- as.POSIXct(DF$A, format = "%m/%d/%Y %H:%M", tz = "GMT")
data.frame(A, B = ave(as.numeric(A), as.Date(A), FUN = rank))

, что дает:

                    A B
1 2019-09-26 23:29:00 4
2 2019-09-26 17:29:00 3
3 2019-09-26 08:29:00 2
4 2019-09-26 01:10:00 1
5 2019-09-25 15:21:00 4
6 2019-09-25 10:19:00 3
7 2019-09-25 05:29:00 2
8 2019-09-25 00:29:00 1

Обратите внимание, что временные ряды в R обычно хранятся в порядке возрастания, а не в порядке убывания.

Примечание

Ввод в воспроизводимом виде:

Lines <- "| A        | B |
| 9/26/2019 23:29 | 4        |

| 9/26/2019 17:29 | 3        |

| 9/26/2019 8:29  | 2        |

| 9/26/2019 1:10  | 1        |

| 9/25/2019 15:21 | 4        |

| 9/25/2019 10:19 | 3        |

| 9/25/2019 5:29  | 2        |

| 9/25/2019 0:29  | 1        |"
DF <- read.table(text = Lines, sep = "|", header = TRUE)["A"]
2 голосов
/ 05 октября 2019

Используя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...