2012-01-12 104 views
8

我想合并两个数据帧,但不希望在有多个匹配项时重复行。相反,我想总结当天的意见。合并不重复行的数据帧

从合并:在两个数据帧中的行指定列相匹配的被提取,并结合在一起。 如果有多个匹配,所有可能的匹配每个贡献一行。

下面是一些示例代码:

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) 

我想最终的数据帧只列出与2

+0

'days'与'z.days'相同吗?在这种情况下,您是否希望最终数据框具有计数为{1,2,3,1}的2012-1- {1,2,3,4}? (注意'obs.days'有2个'2012-1-3','days'有1个) – 2012-01-12 01:19:34

+0

是的,我只是将z.days编辑为几天。感谢您的支持。下面的答案具有预期的输出。我曾尝试过重塑,但我想我需要接下来学习plyr。谢谢! – 2012-01-12 01:46:43

回答

6

我会计数值2012-1-3一次建议您合并它们然后将它们聚合(实质上为每个独特的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一个数据帧,作为该日所有计数的总和。