Как я могу сравнить два разных формата даты? - PullRequest
0 голосов
/ 04 октября 2018

Я хочу сравнить разные форматы даты и установить значение.У меня есть два фрейма данных:

фрейм данных 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

Iхотите сравнить test $ date с dataframe $ date с правилом: Все из test $ date , что в 2012-07 гг., входит в группу 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 голосов
/ 04 октября 2018

С 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
0 голосов
/ 04 октября 2018

Для опции без слияния будет использоваться match.Здесь мы конвертируем test в формат ГГГГ-ММ и 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
...