合并数据帧而不重复行

时间:2012-01-12 01:01:10

标签: r dataframe

我想合并两个数据框,但如果有多个匹配则不想复制行。相反,我想在那一天总结观察结果。

  

来自?merge:提取两个数据框中与指定列匹配的行,并将它们连接在一起。 如果有多个匹配项,则所有可能的匹配项各占一行。

以下是一些示例代码:

days <- as.data.frame(as.Date(c("2012-1-1", "2012-1-2", "2012-1-3", "2012-1-4")))

names(days) <- "Date"
obs.days <- as.data.frame(as.Date(c("2012-1-2", "2012-1-3", "2012-1-3")))
obs.days$count <- 1
colnames(obs.days) <- c("Date", "Count")
df <- merge(days, obs.days, by.x="Date", by.y="Date", all.x=TRUE)

我希望最终数据框只列出2012-1-3一次,计数值为2.

1 个答案:

答案 0 :(得分:6)

我建议你合并它们然后聚合它们(基本上为每个唯一的Date执行一个SUM。)

df <- merge(z.days,obs.days, by.x="Date", by.y="Date", all.x=TRUE)
        Date Count
1 2012-01-01    NA
2 2012-01-02     1
3 2012-01-03     1
4 2012-01-03     1
5 2012-01-04    NA

现在要进行合并,您可以使用aggregate

df2 <- aggregate(df$Count,list(df$Date),sum)
     Group.1  x
1 2012-01-01 NA
2 2012-01-02  1
3 2012-01-03  2
4 2012-01-04 NA
names(df2)<-names(df)

但我推荐包plyr,这太棒了!特别是,函数ddply

library(plyr)
ddply(df,.(Date),function(x) data.frame(Date=x$Date[1],Count=sum(x$Count)))
        Date Count
1 2012-01-01    NA
2 2012-01-02     1
3 2012-01-03     2
4 2012-01-04    NA

命令ddply(df,.(Date),FUN)基本上可以:

for each date in unique(df$Date):
    add to output dataframe FUN( df[df$Date==date,] )

因此,我提供的功能会创建一行数据框,其中包含DateCount列,即该日期所有计数的总和。