【发布时间】:2021-04-09 09:24:26
【问题描述】:
(我实际上想出了一个解决方案,但这并不能满足我对简单性和直观性的渴望,因此我在这里陈述我的问题和解决方案,同时等待一个漂亮而简洁的解决方案。)
我有一个数据,其中一列是Year,另一列是Month,而月份是字符串格式:
Country Month Year Type
<fct> <chr> <dbl> <fct>
1 Argentina June 1975 Currency
2 Argentina February 1981 Currency
3 Argentina July 1982 Currency
我正在尝试将“月”和“年”列合并为单个列 Date,其格式为 date。
第一次尝试
我的第一次尝试是使用mapply,借助lubridate 和我的一个小函数,将month 从字符串转换为整数。
months = c("January", "February", "March", "April", 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December')
month_num = c(1:12)
names(month_num) = months
crisis$Date = mapply(function(y, m){
m = month_num[m]
d = make_date(y,m)
return(d)
},crisis$Year, crisis$Month)
然而这并不是我想要的:
Country Month Year Type Date
<fct> <chr> <dbl> <fct> <list>
1 Argentina June 1975 Currency <date [1]>
2 Argentina February 1981 Currency <date [1]>
3 Argentina July 1982 Currency <date [1]>
4 Argentina September 1986 Currency <date [1]>
,因为Date列是列表格式。
一些谷歌搜索
在this post 的帮助下,以及一些取消列出并将其转回日期对象的操作,我设法得到了我想要的结果:
crisis$Date = as_date(unlist(mapply(function(y, m){
m = month_num[m]
d = make_date(y,m)
return(d)
},crisis$Year, crisis$Month, SIMPLIFY = FALSE)))
结果是
Country Month Year Type Date
<fct> <chr> <dbl> <fct> <date>
1 Argentina June 1975 Currency 1975-06-01
2 Argentina February 1981 Currency 1981-02-01
3 Argentina July 1982 Currency 1982-07-01
4 Argentina September 1986 Currency 1986-09-01
到目前为止,这很好处理,但我相信有更好的解决方案。
【问题讨论】: