我想将两个变量与日期格式合并为一个

时间:2019-01-24 21:06:55

标签: r date datetime time

我有一个数据集,其中有一个字符列为几个月(MONTH)和一个数字列为年份(YEAR)。为了将其用作面板数据,我需要将这些YEARMONTH组合成具有日期格式的变量。

我尝试将变量MONTH更改为数字格式,然后将MONTH与列YEAR合并。 R不会将其识别为日期变量。

当前看起来像这样:

  STATE          MONTH     YEAR     VALUE
California        JAN      2018      800
California        FEB      2018      780
California        MAR      2018      600
    ...           ...       ...      ...
Minesota          JAN      2018      800
Minesota          FEB      2018      780
Minesota          MAR      2018      600
    ...           ...       ...      ...

我想要这样:

  STATE          TIME        VALUE
California     01-2018        800
California     02-2018        780
California     03-2018        600
    ...           ...         ...
Minesota       01-2018        800
Minesota       02-2018        780
Minesota       03-2018        600
    ...           ...         ...

5 个答案:

答案 0 :(得分:3)

我建议您通过以下方式处理此问题:使用真实的R日期,使用as.Date生成R日期,然后使用format呈现所需的字符串输出。像这样:

df$TIME <- format(as.Date(paste0(df$MONTH, df$YEAR, "01"), format="%b%Y%d"), "%m-%Y")

我将第一个随机分配给数据集中的每个日期,但这无关紧要,因为对format的调用只包含月份和年份。

答案 1 :(得分:1)

在基数R中,您可以执行以下操作:

transform(df,TIME = paste(sprintf('%02d',match(MONTH,toupper(month.abb))),YEAR,sep = '-'))[c(1,5,4)]
       STATE    TIME VALUE
1 California 01-2018   800
2 California 02-2018   780
3 California 03-2018   600
4        ...  NA-...   ...
5   Minesota 01-2018   800
6   Minesota 02-2018   780
7   Minesota 03-2018   600

答案 2 :(得分:0)

将蒂姆的回答与易于使用的日期包lubridate结合在一起,我们得到:

# This can handle months of JAN, FEB, ETC. Or it can handle months of 01,02,etc.
df$TIME <- lubridate::ymd(paste0(df$YEAR,df$MONTH,"01")) 

# or if you need it in MM-YYYY format:
df$TIME <- format(lubridate::ymd(paste0(df$YEAR,df$MONTH,"01")), "%m-%Y")

答案 3 :(得分:0)

您可以简化以下内容,但可以更轻松地了解正在发生的事情:

GameObject.Find(tar.spawnedObjects[i].name).GetComponent<PCreator>().Show();

这是使用library(lubridate) library(tidyverse) df2 <- df %>% mutate(TIME = parse_date_time(paste0(MONTH, YEAR), orders = "%b%Y"), TIME = as.character(substr(TIME, 6, 7)), TIME = paste0(TIME, "-", YEAR)) -解析R IMO中日期的最简单方法,来自lubridate的{​​{1}}和来自基础R的dplyr

如果要保留日期列,则只需用管道插入另一个tidyverse,然后将新列命名为其他内容即可。

答案 4 :(得分:0)

如果您想使用Tidyverse的完整解决方案,请考虑tidyrlubridate的{​​{1}}的组合:

parse_date_time

还请检查以下相关问题:Converting year and month ("yyyy-mm" format) to a date?