按日期(年和月)合并data.frame

时间:2016-11-23 10:11:24

标签: r date dataframe merge

第一案例

我有两个data.frames如下:

df1 = read.table(text = 'Date  ID
1980-12-01  2
1982-11-01  1
1990-01-01  6
1993-07-01  9', header = TRUE)

df2 = read.table(text = 'Date  Var
1980-12-17  8
1982-11-07  9
1990-01-19  10
1993-07-20  22', header = TRUE)

我需要将df1和df2合并到Date列,但只考虑年份和月份,也因为合并不起作用(因为天数不同)。

我的输出应该是这样的:

Date    ID  Var
1980-12  2    8
1982-11  1    9
1990-01  6   10
1993-07  9   22

我考虑删除Date列中的Days,但我想知道是否有更快的方法来执行此操作。我也检查过,似乎没有人问过这个问题。

由于

更新

第二案例

正如评论中所建议的那样,如果我在一个data.frame中的同一年份和月份中有多个观察结果怎么办?

e.g。

df1 = read.table(text = 'Date  ID #as 1st Case
1980-12-01  2
1982-11-01  1
1990-01-01  6
1993-07-01  9', header = TRUE)

df3 = read.table(text = 'Date  Var
    1980-12-17  8
    1980-12-29  4
    1980-12-30  1
    1982-11-07  9
    1982-11-12  1
    1990-01-19  10
    1990-01-22  21
    1993-07-20  22
    1993-07-26  12', header = TRUE)

我的新输出应该是:

Date   Var    ID
1980-12  8     2
1980-12  4     2
1980-12  1     2
1982-11  9     1
1982-11  1     1
1990-01  10    6
1990-01  21    6
1993-07  22    9
1993-07  12    9

更新

第三案例

如果我在两个data.frames中的同一年份和月份中有多个观察结果怎么办?

df4 = read.table(text = 'Date  ID 
    1980-12-01  1
    1980-12-01  2
    1982-11-01  3
    1982-11-01  4
    1990-01-01  5
    1990-01-01  6
    1993-07-01  7
    1993-07-01  8', header = TRUE)

df3 = read.table(text = 'Date  Var      #as 2nd Case
    1980-12-17  8
    1980-12-29  4
    1980-12-30  1
    1982-11-07  9
    1982-11-12  1
    1990-01-19  10
    1990-01-22  21
    1993-07-20  22
    1993-07-26  12', header = TRUE)

新输出应为:

    Date       Var  ID
    1980-12-17   8   1
    1980-12-17   8   2
    1980-12-29   4   1
    1980-12-29   4   2
    1980-12-30   1   1
    1980-12-30   1   2
    1982-11-07   9   3
    1982-11-07   9   4
    1982-11-12   1   3
    1982-11-12   1   4
    1990-01-19   10  5
    1990-01-19   10  6
    1990-01-22   21  5
    1990-01-22   21  6
    1993-07-20   22  7
    1993-07-20   22  8
    1993-07-26   12  7
    1993-07-26   12  8

2 个答案:

答案 0 :(得分:4)

您需要将日期格式化为月份和年份格式。然后你定期合并。

df1$my=format(as.Date(df1$Date), "%Y-%m")
df2$my=format(as.Date(df2$Date), "%Y-%m")
merge(df1,df2, by='my')

对于同年和月份的多次观察,这仍然有效。

df1$my=format(as.Date(df1$Date), "%Y-%m")
df3$my=format(as.Date(df3$Date), "%Y-%m")
merge(df1,df3, by='my')
      my     Date.x ID     Date.y Var
1 1980-12 1980-12-01  2 1980-12-17   8
2 1980-12 1980-12-01  2 1980-12-29   4
3 1980-12 1980-12-01  2 1980-12-30   1
4 1982-11 1982-11-01  1 1982-11-07   9
5 1982-11 1982-11-01  1 1982-11-12   1
6 1990-01 1990-01-01  6 1990-01-19  10
7 1990-01 1990-01-01  6 1990-01-22  21
8 1993-07 1993-07-01  9 1993-07-20  22
9 1993-07 1993-07-01  9 1993-07-26  12

对于更新3,可以使用

merge(df4,df3, by='my', all = T)

答案 1 :(得分:2)

我们将数据集中的“日期”转换为Date类,format为年 - 月格式,并将merge转换为一起。

merge(transform(df1, Date = format(as.Date(Date), "%Y-%m")), 
             transform(df2, Date = format(as.Date(Date), "%Y-%m")))
#     Date ID Var
#1 1980-12  2   8
#2 1982-11  1   9
#3 1990-01  6  10
#4 1993-07  9  22

或者,如果有很多数据集,请将其放在list中并进行转换和合并

Reduce(function(...) merge(...), 
    lapply(mget(paste0("df", 1:2)), transform, Date = format(as.Date(Date), "%Y-%m")))