Существует ли функция R, которая будет ранжировать даты / время по другим критериям столбца? - PullRequest
1 голос
/ 29 мая 2019

Меня интересует изменение столбца даты в dataf на упорядоченные числа (самая ранняя дата = 1, вторая самая ранняя = 2 ... и т. Д.), Соответствующие id, как в результатах $ order.Если идентификатор появляется только один раз, я бы хотел, чтобы этот порядок был 1.

date=c("2012-02-18", "2013-03-01", "2013-04-11", "2013-06-06", "2013-09-20", "2013-07-02")
datef=strptime(date, format="%Y-%m-%d")
dataf=data.frame(id=c(20, 20, 20, 21, 21, 22), 
              date=datef, 
              service=c("web", "phone", "person", "phone", "web", "web"))
> dataf
  id       date service
1 20 2012-02-18     web
2 20 2013-03-01   phone
3 20 2013-04-11  person
4 21 2013-06-06   phone
5 21 2013-09-20     web
6 22 2013-07-02     web

Мне трудно даже найти правильную формулировку для поиска ответа на эту дилемму.Я ищу принуждение?или индекс?dataf $ объединяет результаты в $ порядке ниже?

results=data.frame(id=c(20, 20, 20, 21, 21, 22), 
                   order=c(1,2,3,1,2,1), 
                   service=c("web", "phone", "person", "phone", "web", "web"))

> results
  id order service
1 20     1     web
2 20     2   phone
3 20     3  person
4 21     1   phone
5 21     2     web
6 22     1     web

Ответы [ 2 ]

1 голос
/ 29 мая 2019

С dplyr:

library(dplyr)
dataf %>% group_by(id) %>% mutate(order = rank(date))
# # A tibble: 6 x 4
# # Groups:   id [3]
#      id date                service order
#   <dbl> <dttm>              <fct>   <dbl>
# 1    20 2012-02-18 00:00:00 web         1
# 2    20 2013-03-01 00:00:00 phone       2
# 3    20 2013-04-11 00:00:00 person      3
# 4    21 2013-06-06 00:00:00 phone       1
# 5    21 2013-09-20 00:00:00 web         2
# 6    22 2013-07-02 00:00:00 web         1
0 голосов
/ 29 мая 2019

С data.table:

library(data.table)

setDT(dataf)

setorder(dataf, id, date)
dataf[, order := 1:.N, by = id]
> dataf
   id       date service order
1: 20 2012-02-18     web     1
2: 20 2013-03-01   phone     2
3: 20 2013-04-11  person     3
4: 21 2013-06-06   phone     1
5: 21 2013-09-20     web     2
6: 22 2013-07-02     web     1
...