如何组合两个不同长度的数据帧?

时间:2016-12-29 01:26:19

标签: r date merge

我有2个数据框。这些如下:

df1
Date    Duration
6/27/2014   10.00
6/30/2014   20.00
7/11/2014   15.00

df2
Date    Percent_Removal
6/27/2014   20.39
6/30/2014   27.01
7/7/2014    49.84
7/11/2014   59.48
7/17/2014   99.04

我想根据'日期'合并这两个数据框。 df1中的列。输出应如下所示:

df3
Date    Duration_sum    Percent_Removal
6/27/2014   10.00        20.39
6/30/2014   20.00        27.01
7/11/2014   15.00        59.48

我尝试了以下功能:

df1$Date <- as.Date (df1$Date, format= "%m/%d/%Y")
df2$Date <- as.Date (df2$Date, format= "%m/%d/%Y")
df3<- as.data.frame (merge(df1,df2,by.x = "Date",all.x = TRUE))

我的输出是:

DF3

 Date      Duration_sum   Percent_Removal
6/27/2014     10.00           NA
6/30/2014     20.00           NA
7/11/2014     15.00           NA

如果有人可以帮我解决这个问题,我将非常感激。提前谢谢。

2 个答案:

答案 0 :(得分:0)

你可能超级懒惰,并且完全避免制作第三个df:

 df1$Percent_removal<-df2$Percent_removal[df2$Date==df1$Date]

仅当每个df中每个日期只有1个实例时,这才有效。一个更细微的方法可能是涉及plyr包。

答案 1 :(得分:0)

这对评论来说太长了,但实际上只需要证明我在评论中提供的解决方案确实有效。如果您在合并工作时遇到问题,那么您的数据必然存在其他问题,我们无法诊断这些问题,因为您没有提供数据的输入。

df1 = read.table(text = 
"Date    Duration
6/27/2014   10.00
6/30/2014   20.00
7/11/2014   15.00",
header = T)

df2 = read.table(text = 
"Date    Percent_Removal
6/27/2014   20.39
6/30/2014   27.01
7/7/2014    49.84
7/11/2014   59.48
7/17/2014   99.04",
header = T)

df1$Date <- as.Date (df1$Date, format= "%m/%d/%Y")
df2$Date <- as.Date (df2$Date, format= "%m/%d/%Y")

df3 = merge(df1,df2)
#         Date Duration Percent_Removal
# 1 2014-06-27       10           20.39
# 2 2014-06-30       20           27.01
# 3 2014-07-11       15           59.48

请注意,不需要在merge语句中指定其他选项,因为

  1. 默认值by =是两个数据框共有的列名。在这种情况下,只共享Date
  2. 默认值all.xall.yall提供了所需的行为,其中只保留两个数据框中的行。