我想合并两个数据框,但如果有多个匹配则不想复制行.相反,我想在那一天总结观察结果.
来自?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)
Run Code Online (Sandbox Code Playgroud)
我希望最终的数据框只能列出2012-1-3一次,计数值为2.
我建议你合并它们然后聚合它们(基本上为每个唯一的执行SUM Date
).
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
Run Code Online (Sandbox Code Playgroud)
现在要进行合并,您可以使用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)
Run Code Online (Sandbox Code Playgroud)
但我推荐套餐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
Run Code Online (Sandbox Code Playgroud)
该命令ddply(df,.(Date),FUN)
基本上做:
for each date in unique(df$Date):
add to output dataframe FUN( df[df$Date==date,] )
Run Code Online (Sandbox Code Playgroud)
因此,我提供的函数创建了一行包含列的数据框,Date
并且Count
是该日期所有计数的总和.