【问题标题】:Merging data frames without duplicating rows合并数据框而不重复行
【发布时间】:2012-02-08 09:00:45
【问题描述】:

我想合并两个数据框,但如果有多个匹配项,我不想重复行。相反,我想总结当天的观察结果。

来自 ?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。

【问题讨论】:

  • daysz.days 一样吗?在这种情况下,您是否希望最终数据帧具有计数为 {1,2,3,1} 的 2012-1-{1,2,3,4} ? (注意obs.days 有 2 个 2012-1-3days 有 1 个)
  • 是的,我刚刚编辑了 z.days 到几天。谢谢你抓住它。您在下面的答案具有预期的输出。我已经尝试过 reshape,但我想我接下来需要学习 plyr。谢谢!

标签: r dataframe


【解决方案1】:

我建议你合并它们然后聚合它们(基本上对每个唯一的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 列的一行数据框,这是该日期所有计数的总和。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-06
    • 2020-04-10
    • 2021-12-04
    • 1970-01-01
    • 2017-11-13
    • 2017-11-26
    • 1970-01-01
    相关资源
    最近更新 更多