我有两个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
答案 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")))