2012-01-12 175 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一個數據幀,作爲該日所有計數的總和。