我想合并两个数据框,但如果有多个匹配则不想复制行。相反,我想在那一天总结观察结果。
来自?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.
答案 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,] )
因此,我提供的功能会创建一行数据框,其中包含Date
和Count
列,即该日期所有计数的总和。