【问题标题】:keep most recent observations when there are duplicates in R当 R 中有重复时,保留最新的观察结果
【发布时间】:2020-02-24 23:43:48
【问题描述】:

我有以下数据。

  date                         var1    level       score_1     score_2
   2020-02-19 12:10:52.166661    dog      n1           1           3
   2020-02-19 12:17:25.087898    dog      n1           3           6
   2020-02-19 12:34:27.624939    dog      n2           4           3
   2020-02-19 12:35:50.522116    cat      n1           2           0
   2020-02-19 12:38:49.547181    cat      n2           3           4

对于任何组合 var1 & level 都应该只有一个观察值。我想消除重复并只保留最近的记录。在前面的例子中,第一行应该被删除,因为第 2 行的 dog-n1 是最近的。不过,我想保留第 3 行,即使 var1 也等于“dog”,因为级别不同。

那么,我想得到什么:

  date                         var1    level       score_1     score_2
   2020-02-19 12:17:25.087898    dog      n1           3           6
   2020-02-19 12:34:27.624939    dog      n2           4           3
   2020-02-19 12:35:50.522116    cat      n1           2           0
   2020-02-19 12:38:49.547181    cat      n2           3           4

【问题讨论】:

    标签: r duplicates


    【解决方案1】:

    使用tidyverse

    df %>%
    group_by(var1, level) %>%
    filter(date == max(date)) %>%
    ungroup()
    

    【讨论】:

    • 没有必要安装整个tidyversedplyr 应该足以满足您的解决方案(我们经常忘记并不是每个人都安装了tidyverse(还),这是一个相当大的集合大包装)
    • 真实故事。我也忘记了tidyverse中的哪些子包有时有什么功能。
    【解决方案2】:

    在基础 R 中,使用 duplicated。看起来您的数据已经按日期排序,因此您可以使用

    df[!duplicated(df[c("var1", "level")], fromLast = TRUE), ]
    

    (默认情况下,duplicated 将在任何第一次出现的情况下提供FALSE,而在每隔一个出现的情况下提供TRUE。设置fromLast = TRUE 将反转方向,因此最后次出现被保留)

    如果您不确定您的数据是否已经排序,请先排序!

    df = df[order(df$var1, df$level, dfd$date), ]
    

    【讨论】:

      【解决方案3】:

      你也可以使用data.table的方法如下:

      library(data.table)
      setDT(df)[, .SD[which.max(date)], .(var1, level)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-27
        • 2017-02-28
        • 2018-01-07
        • 1970-01-01
        相关资源
        最近更新 更多