Присвоение определенных лет числу в R - PullRequest
0 голосов
/ 25 апреля 2019

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

У меня есть df 'Players', в котором есть колонка дат между 2003-2018 годами. Вот пример того, как выглядит df:

Start             Apps
01/01/2003         10
06/05/2006         42
23/01/2004         23
30/06/2010         34
11/06/2006         23
21/01/2005         45
12/07/2004          3
03/01/2010         76
01/01/2009         34

Можно ли каким-либо образом установить для каждого дня каждого года равное число, например, любую дату с «2003» = 1, любую дату с «2004» = 2, любую дату с «2005» = 3 и т.д., чтобы вывод мог выглядеть примерно так:

Year             Apps       YearValue
01/01/2003         10           1
06/05/2006         42           4
23/01/2004         23           2
30/06/2010         34           8
11/06/2006         23           4
21/01/2005         45           3
12/07/2004          3           2
03/01/2010         76           8
01/01/2009         34           7

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Мы извлекаем year из столбца «Пуск», приводим factor преобразованный год к integer

library(dplyr)
library(lubridate)
df1 %>% 
   mutate(YearValue = as.integer(factor(year(dmy(Start)), levels = 2003:2010))) %>% 
   rename(Year = Start)
#        Year Apps YearValue
#1 01/01/2003   10         1
#2 06/05/2006   42         4
#3 23/01/2004   23         2
#4 30/06/2010   34         8
#5 11/06/2006   23         4
#6 21/01/2005   45         3
#7 12/07/2004    3         2
#8 03/01/2010   76         8
#9 01/01/2009   34         7

Как @Parfait упоминается в комментариях,base R эквивалент будет

within(df, { 
           Start <- as.Date(Start, format="%d/%m/%Y")
           Year <- as.integer(format(Start, format="%Y"))
          YearValue <- as.integer(factor(Year, levels = 2003:2010))
          rm(Year)
         })

data

df1 <- structure(list(Start = c("01/01/2003", "06/05/2006", "23/01/2004", 
"30/06/2010", "11/06/2006", "21/01/2005", "12/07/2004", "03/01/2010", 
"01/01/2009"), Apps = c(10L, 42L, 23L, 34L, 23L, 45L, 3L, 76L, 
34L)), class = "data.frame", row.names = c(NA, -9L))
0 голосов
/ 25 апреля 2019

Это может быть один из тех случаев, когда мы задумываемся над проблемой. Как только вы извлекаете год для каждой даты, все, что вы пытаетесь сделать, это отсчитывать хронологически оттуда. Это означает просто вычитать 2002 из каждого года, так что 2003 (первый год) равен 1. Более гибко, вычтите самый ранний год, затем добавьте 1.

library(dplyr)

df1 %>%
  mutate(Year = lubridate::dmy(Start) %>% lubridate::year()) %>%
  mutate(YearStart = Year - min(Year) + 1)
#>        Start Apps Year YearStart
#> 1 01/01/2003   10 2003         1
#> 2 06/05/2006   42 2006         4
#> 3 23/01/2004   23 2004         2
#> 4 30/06/2010   34 2010         8
#> 5 11/06/2006   23 2006         4
#> 6 21/01/2005   45 2005         3
#> 7 12/07/2004    3 2004         2
#> 8 03/01/2010   76 2010         8
#> 9 01/01/2009   34 2009         7

Удалите столбец Year, если вам нужно - я оставил его здесь, чтобы показать.

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