【问题标题】:R: identify duplicate rows and remove the old entry(By Date)R:识别重复行并删除旧条目(按日期)
【发布时间】:2017-04-14 03:53:44
【问题描述】:

我有一个如下形式的数据框:

   ID    value    modified
1  AA    30       2016-11-03
2  AB    40       2016-11-04
3  AC    50       2016-11-05
4  AA    60       2016-11-06
5  AB    20       2016-11-07

我想识别 ID 列的所有重复行并删除修改时间相对较旧的行。所以输出将是:

   ID    value    modified
1  AC    50       2016-11-05
2  AA    60       2016-11-06
3  AB    20       2016-11-07

我正在尝试的代码如下:

ID<-c('AA','AB','AD','AA','AB')
value<-c(30,40,50,60,20)
modified<-c('2016-11-03','2016-11-04','2016-11-05','2016-11-06','2016-11-07')
df<-data.frame(ID=ID,value=value,modified=modified)
df
  ID value   modified
1 AA    30 2016-11-03
2 AB    40 2016-11-04
3 AD    50 2016-11-05
4 AA    60 2016-11-06
5 AB    20 2016-11-07

df[!duplicated(df$ID),]
  ID value   modified
1 AA    30 2016-11-03
2 AB    40 2016-11-04
3 AD    50 2016-11-05

但这不是我想要的输出,我怎样才能删除旧条目?提前感谢您提供任何线索或提示。

【问题讨论】:

    标签: r dataframe duplicates


    【解决方案1】:

    您可以按如下方式使用 dplyr 包:

    library(dplyr)
    library(magrittr)
    
    df %<>% group_by(ID) %>% filter(modified==max(modified))
    

    如果你想要一个新变量中的结果

    library(dplyr)
    
    df2 <- df %>% group_by(ID) %>% filter(modified==max(modified))
    

    【讨论】:

    • 这是完整的代码吗?我认为错字有问题?
    • 抱歉在最后添加了一个缺少的括号
    • 是的,它有效。你能告诉我 %>% 是什么吗?
    • 当然,它们用于将结果传递给下一个操作/功能,您可以在此处阅读更多信息r-statistics.com/2014/08/…
    【解决方案2】:

    您可以通过首先按日期对数据框进行排序来解决base R的问题:

    df <- df[order(df[["modified"]], decreasing = TRUE), ]
    

    然后您可以使用!duplicated 解决方案获得最终结果:

    df[!duplicated(df$ID), ]
    

    【讨论】:

    • df[!duplicated(df$ID, fromLast=TRUE),] - 在当前示例中无需先进行排序。
    • @thelatemail,我喜欢你的评论,而且我学到了一些新东西,但这只有在 modified 按时间顺序排列时才有效,这在示例中似乎是正确的,但可能不成立。
    猜你喜欢
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2014-12-28
    相关资源
    最近更新 更多