如何比较两种不同的日期格式?

时间:2018-10-04 08:08:06

标签: r date merge compare

我想比较不同的日期格式并设置一个值。我有两个数据框:

数据框1:测试

  head(test)
          number                  date            country
        1   6317004100         2012-10-30                  Italy
        2   6317071200         2013-12-02                Germany      
        3   6317064800         2013-03-06                    USA
        4   6317071200         2013-11-06                Germany       
        5   6317071200         2013-08-12                Germany           
        6   6317004100         2012-10-26                Croatia

数据框2:数据框

head(dataframe)
            date            group
1           2012-07             1
2           2012-08             1
3           2012-09             2
4           2012-10             2
5           2012-11             2
6           2012-12             2
7           2013-01             3
8           2013-02             3
9           2013-03             3
10          2013-04             3
11          2013-05             3
12          2013-06             3
13          2013-07             4
14          2013-08             4
15          2013-09             4
16          2013-10             4
17          2013-11             4
18          2013-12             4

我要比较 test $ date dataframe $ date 的规则: 2012-07中 test $ date 的所有内容都进入第1组,而2012-08中的所有内容都进入第1组,依此类推...我得到以下输出:

 > test
          number                  date           country   group 
        1   6317004100         2012-10-30          Italy    2
        2   6317071200         2013-12-02        Germany    4   
        3   6317064800         2013-03-06            USA    4
        4   6317071200         2013-11-06        Germany    4   
        5   6317071200         2013-08-12        Germany    4       
        6   6317004100         2012-10-26        Croatia    2

我尝试过:

> merge(dataframe, test, by.x="date", by.y="date")
[1] date group number country 
<0 rowes> (or row.names with length 0) 

但是什么也没发生。两个日期列都是因素。

有什么想法可行吗?

2 个答案:

答案 0 :(得分:1)

一个非合并选项将使用match。在这里,我们将test转换为YYYY-MM格式,并用match dataframe$date将其转换为group

test$group <- dataframe$group[
               match(format(as.Date(test$date), "%Y-%m"), dataframe$date)]


test
#      number       date country group
#1 6317004100 2012-10-30   Italy     2
#2 6317071200 2013-12-02 Germany     4
#3 6317064800 2013-03-06     USA     3
#4 6317071200 2013-11-06 Germany     4
#5 6317071200 2013-08-12 Germany     4
#6 6317004100 2012-10-26 Croatia     2

merge选项将通过创建新的Date2

test$Date2 <- format(as.Date(test$date),"%Y-%m")
merge(dataframe, test, by.x = "date", by.y = "Date2")

#  date    group     number       date country
#1 2012-10     2 6317004100 2012-10-30   Italy
#2 2012-10     2 6317004100 2012-10-26 Croatia
#3 2013-03     3 6317064800 2013-03-06     USA
#4 2013-08     4 6317071200 2013-08-12 Germany
#5 2013-11     4 6317071200 2013-11-06 Germany
#6 2013-12     4 6317071200 2013-12-02 Germany

答案 1 :(得分:1)

使用tidyverse

df1%>%
   mutate(mnt=format(as.Date(date), "%Y-%m"))%>%
   left_join(df2%>%mutate(date=as.character(date)),by=c("mnt"="date"))
      number       date country     mnt group
1 6317004100 2012-10-30   Italy 2012-10     2
2 6317071200 2013-12-02 Germany 2013-12     4
3 6317064800 2013-03-06     USA 2013-03     3
4 6317071200 2013-11-06 Germany 2013-11     4
5 6317071200 2013-08-12 Germany 2013-08     4
6 6317004100 2012-10-26 Croatia 2012-10     2