Сделать даты в порядковые переменные - PullRequest
0 голосов
/ 04 июня 2019

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

Вот фиктивный набор данных:

library(dplyr)
library(lubridate)
problem <- tibble(name = c("Britney", "Christina", "Justin", "Britney", "Britney", "Christina", "Christina", "Christina"),
                  score = c(1, 2, 3, 3, 3, 2, 4, 2),
                  date = ymd_hms(c("2019-02-26 00:18:09", "2019-04-26 00:18:09", "2019-02-20 00:18:09", "2018-02-26 00:18:09", "2017-02-26 00:18:09", "2016-02-26 00:18:09", "2015-02-26 00:18:09", "2010-02-26 00:18:09")))

И вот как я хочу, чтобы это выглядело в конце:

solution <- tibble(name = c("Britney", "Christina", "Justin", "Britney", "Britney", "Christina", "Christina", "Christina"),
                  score = c(1, 2, 3, 3, 3, 2, 4, 2),
                  date = ymd_hms(c("2019-02-26 00:18:09", "2019-04-26 00:18:09", "2019-02-20 00:18:09", "2018-02-26 00:18:09", "2017-02-26 00:18:09", "2016-02-26 00:18:09", "2015-02-26 00:18:09", "2010-02-26 00:18:09")),
                  order = c(3, 4, 1, 2, 1, 3, 2, 1))

solution

Спасибо!

Ответы [ 4 ]

2 голосов
/ 04 июня 2019

Вы можете просто сгруппировать по именам и взять обратную последовательность, то есть

library(dplyr)

problem %>% 
 group_by(name) %>% 
 mutate(order = rev(seq(n())))

, что дает,

# A tibble: 8 x 4
# Groups:   name [3]
  name      score date                order
  <chr>     <dbl> <dttm>              <int>
1 Britney       1 2019-02-26 00:18:09     3
2 Christina     2 2019-04-26 00:18:09     4
3 Justin        3 2019-02-20 00:18:09     1
4 Britney       3 2018-02-26 00:18:09     2
5 Britney       3 2017-02-26 00:18:09     1
6 Christina     2 2016-02-26 00:18:09     3
7 Christina     4 2015-02-26 00:18:09     2
8 Christina     2 2010-02-26 00:18:09     1
1 голос
/ 04 июня 2019

Вы можете использовать rowid из data.table

library(data.table)
setDT(problem)

problem[order(date), order := rowid(name)]

Или вы можете использовать frank для ранжирования дат по имени

problem[, order := frank(date), name]

Вывод любого метода

problem
#         name score                date order
# 1:   Britney     1 2019-02-26 00:18:09     3
# 2: Christina     2 2019-04-26 00:18:09     4
# 3:    Justin     3 2019-02-20 00:18:09     1
# 4:   Britney     3 2018-02-26 00:18:09     2
# 5:   Britney     3 2017-02-26 00:18:09     1
# 6: Christina     2 2016-02-26 00:18:09     3
# 7: Christina     4 2015-02-26 00:18:09     2
# 8: Christina     2 2010-02-26 00:18:09     1
1 голос
/ 04 июня 2019

Или group_by name и присвойте row_number после упорядочения данных по name и date

library(dplyr)

problem %>%
  arrange(name, date) %>%
  group_by(name) %>%
  mutate(order = row_number())


# A tibble: 8 x 4
# Groups:   name [3]
#   name      score date                order
#   <chr>     <dbl> <dttm>              <int>
#1 Britney       3 2017-02-26 00:18:09     1
#2 Britney       3 2018-02-26 00:18:09     2
#3 Britney       1 2019-02-26 00:18:09     3
#4 Christina     2 2010-02-26 00:18:09     1
#5 Christina     4 2015-02-26 00:18:09     2
#6 Christina     2 2016-02-26 00:18:09     3
#7 Christina     2 2019-04-26 00:18:09     4
#8 Justin        3 2019-02-20 00:18:09     1
1 голос
/ 04 июня 2019

Мы можем преобразовать в factor и привести к integer

library(dplyr)
problem %>% 
    group_by(name) %>% 
    mutate(n = as.integer(factor(date)))
# A tibble: 8 x 4
# Groups:   name [3]
#  name      score date                    n
#  <chr>     <dbl> <dttm>              <int>
#1 Britney       1 2019-02-26 00:18:09     3
#2 Christina     2 2019-04-26 00:18:09     4
#3 Justin        3 2019-02-20 00:18:09     1
#4 Britney       3 2018-02-26 00:18:09     2
#5 Britney       3 2017-02-26 00:18:09     1
#6 Christina     2 2016-02-26 00:18:09     3
#7 Christina     4 2015-02-26 00:18:09     2
#8 Christina     2 2010-02-26 00:18:09     1

Или после группировки по «имени» применить dense_rank к «дате»

problem %>% 
    group_by(name) %>%
    mutate(n = dense_rank(date))
# A tibble: 8 x 4
# Groups:   name [3]
#  name      score date                    n
#  <chr>     <dbl> <dttm>              <int>
#1 Britney       1 2019-02-26 00:18:09     3
#2 Christina     2 2019-04-26 00:18:09     4
#3 Justin        3 2019-02-20 00:18:09     1
#4 Britney       3 2018-02-26 00:18:09     2
#5 Britney       3 2017-02-26 00:18:09     1
#6 Christina     2 2016-02-26 00:18:09     3
#7 Christina     4 2015-02-26 00:18:09     2
#8 Christina     2 2010-02-26 00:18:09     1

ПРИМЕЧАНИЕ. Оба решения основаны на просмотре переменной date.Других предположений нет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...