将特定年份分配给R中的数字

将特定年份分配给R中的数字,r,R,我对R很陌生,所以非常感谢您的帮助 我有一个df“玩家”,其中有一列日期在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

我对R很陌生,所以非常感谢您的帮助

我有一个df“玩家”,其中有一列日期在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

我们从“开始”列中提取
,强制将
因子
转换为
整数

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)
         })
在(df,{

开始这可能是我们过度思考问题的一种情况。一旦你提取每个日期的年份,你要做的就是从那里按时间顺序计算。这意味着只需从每年减去2002年,那么2003年(第一年)是1。更灵活地说,减去最早的年份,然后再加1

库(dplyr)
df1%>%
突变(年份=lubridate::dmy(开始)%%>%lubridate::Year())%%>%
突变(年开始=年-最小(年)+1)
#>开始应用程序年度开始
#> 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
列—我把它放在这里只是为了显示。

您的第一个问题(因为akrun正在解决)是确保
Year
列不是字符串,即
Date
POSIXt
(日期/时间)的类虽然将日期作为字符串来工作当然是可行的,但是尝试按顺序或离散方式匹配年或其他任何事情的开销都是繁重的。如果每次重复类似的计算,将其转换为日期可能是低效的,那么您可以考虑将其转换为“永久性”。对于
玩家$Year,对于tinyverse(即基本R)对应:
在(df,{Start
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))