【问题标题】:Deleting duplicated rows based on condition (position)根据条件(位置)删除重复行
【发布时间】:2019-09-29 15:13:34
【问题描述】:

我有一个看起来像这样的数据集

df <- data.frame("id" = c("Alpha", "Alpha", "Alpha","Alpha","Beta","Beta","Beta","Beta"), 
                 "Year" = c(1970,1970,1970,1971,1980,1980,1981,1982), 
                 "Val" = c(2,3,-2,5,2,5,3,5))

我对每个 id 和时间标识符都有多个观察结果 - 例如我有 3 个不同的 alpha 1970 值。我想每个 id/year 只保留一个观察结果,最值得注意的是每个 id/year 出现的最后一个观察结果。 最终数据集应如下所示:

final <- data.frame("id" = c("Alpha","Alpha","Beta","Beta","Beta"), 
                    "Year" = c(1970,1971,1980,1981,1982), 
                    "Val" = c(-2,5,5,3,5))

有谁知道我可以如何解决这个问题?

非常感谢您的帮助

【问题讨论】:

标签: r duplicates data-manipulation


【解决方案1】:

如果您愿意接受data.table 解决方案,这可以非常简洁地完成:

library(data.table)

setDT(df)[, .SD[.N], by = c("id", "Year")]
#>       id Year Val
#> 1: Alpha 1970  -2
#> 2: Alpha 1971   5
#> 3:  Beta 1980   5
#> 4:  Beta 1981   3
#> 5:  Beta 1982   5

by = c("id", "Year")idYear 对data.table 进行分组,.SD[.N] 然后返回每个此类组中的最后一行。

【讨论】:

    【解决方案2】:

    这个怎么样?

    library(tidyverse)
    
    df <- data.frame("id" = c("Alpha", "Alpha", "Alpha","Alpha","Beta","Beta","Beta","Beta"), 
                     "Year" = c(1970,1970,1970,1971,1980,1980,1981,1982), 
                     "Val" = c(2,3,-2,5,2,5,3,5))
    
    final <- 
      df %>% 
      group_by(id, Year) %>% 
      slice(n()) %>% 
      ungroup()
    
    final
    #> # A tibble: 5 x 3
    #>   id     Year   Val
    #>   <fct> <dbl> <dbl>
    #> 1 Alpha  1970    -2
    #> 2 Alpha  1971     5
    #> 3 Beta   1980     5
    #> 4 Beta   1981     3
    #> 5 Beta   1982     5
    

    reprex package (v0.3.0) 于 2019 年 9 月 29 日创建

    翻译为“在每个id-Year组内,只取行号等于组大小的行,即当前排序下的最后一行。”

    您也可以使用filter(),例如filter(row_number() == n())distinct()(然后你甚至不必分组),例如distinct(id, Year, .keep_all = TRUE) - 但distinct 函数采用第一个不同的行,因此您需要先在此处反转行顺序。

    【讨论】:

    • @Alessandro 乐于助人。请记得采纳答案! :)
    • 当然可以,但是如果我在 10 分钟之前接受答案,系统会阻止我。你得有点耐心
    • @Alessandro 不知道!
    • 您有什么相反的想法吗?即只选择第一行?这也将非常有帮助!
    • 是的,这只是我建议的distinct() 解决方案,原样。 distinct(id, Year, .keep_all = TRUE)。或者使用 n() 而不是 1 逐组切片。
    【解决方案3】:

    base R 的选项

    aggregate(Val ~ ., df, tail, 1)
    #     id Year Val
    #1 Alpha 1970  -2
    #2 Alpha 1971   5
    #3  Beta 1980   5
    #4  Beta 1981   3
    #5  Beta 1982   5
    

    如果我们需要选择第一行

    aggregate(Val ~ ., df, head, 1)
    

    【讨论】:

    • 您有什么相反的想法吗?即只选择第一行?这也将非常有帮助!
    • 谢谢!太好了
    猜你喜欢
    • 2021-04-02
    • 2021-12-20
    • 2019-04-19
    • 1970-01-01
    • 2021-11-04
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    相关资源
    最近更新 更多