将特定年份分配给R中的数字
我对R很陌生,所以非常感谢您的帮助 我有一个df“玩家”,其中有一列日期在2003-2018年之间。以下是df外观的示例:将特定年份分配给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
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))