合并数据帧而不重复行

Boo*_*aka 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)
Run Code Online (Sandbox Code Playgroud)

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

mat*_*fee 6

我建议你合并它们然后聚合它们(基本上为每个唯一的执行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是该日期所有计数的总和.