【问题标题】:Removing duplicate rows in panel data by criteria按条件删除面板数据中的重复行
【发布时间】:2019-06-13 00:50:36
【问题描述】:

我有一个基本问题,我希望不是复制。我环顾四周,但找不到直接解决这个问题的人。 我有一个如下所示的数据集:

   df <- data.frame("Reporter" = c("USA", "USA", "USA", "USA", 
"EU","EU", "EU","EU" ), 
                 "Year" = c(1970, 1970, 1980, 1990, 1970, 1980, 
 1980,1990), 
                 "Val" = c(1,0,1,1,0,0,0,1),
                "Val2" = c(0,0,0,1,0,1,0,1))

问题是我有一些重复的国家年份观察,这给我的分析带来了问题。 (美国 1970 年为 val1,欧盟 1980 年为 val2)。

我想删除重复的行,始终保持不匹配分数的最高值 (1)。由于我有数百行的这个问题,我想知道是否有一种自动方法来找出哪些数据是重复的并删除具有较小值的数据

我找到了一种方法来区分重复的行

df1<- df%>% select(Reporter, Year)
df1$duplicat <- duplicated(df1) %>% filter(duplicat=="TRUE")

但我仍然不确定如何根据指定的条件删除它们。通常我会使用 anti_join,但它不起作用,因为 df1 数据匹配两行。

提前感谢您的帮助

【问题讨论】:

    标签: r duplicates


    【解决方案1】:

    你可以使用data.table:

    setDT(df)[order(-Val)][,.SD[1,], by = .(Reporter, Year)] 
    

    【讨论】:

      【解决方案2】:

      一种方法是按ValVal2df 进行排序,然后删除ReporterYear 列匹配的重复项:

      df <- df[order(df[,'Val'],df[,'Val2'], decreasing=TRUE),]
      df <- df[!duplicated(df[c("Reporter","Year")]),]
      
      
        Reporter Year Val Val2
      4      USA 1990   1    1
      8       EU 1990   1    1
      1      USA 1970   1    0
      3      USA 1980   1    0
      6       EU 1980   0    1
      5       EU 1970   0    0
      

      【讨论】:

        【解决方案3】:

        dplyr 选项将通过ValVal2arrange 数据帧,并为每个ReporterYear 选择最后一行。

        library(dplyr)
        
        df %>%
          arrange(Val, Val2) %>%
          group_by(Reporter, Year) %>%
          slice(n())
        
        #  Reporter  Year   Val  Val2
        #  <fct>    <dbl> <dbl> <dbl>
        #1 EU        1970     0     0
        #2 EU        1980     0     1
        #3 EU        1990     1     1
        #4 USA       1970     1     0
        #5 USA       1980     1     0
        #6 USA       1990     1     1
        

        【讨论】:

        • 谢谢你,我通常更喜欢使用 dplyr,但是它告诉我 slice 不适用于类数据表的对象......但是我能够用 data.table 解决问题!无论如何,谢谢
        • @Alessandro 我不知道您有data.table,因为您共享的数据是数据框。尽管如此,当我将 df 更改为 data.table 时,它仍然对我有用。您可以尝试重新启动会话并再次检查吗?
        • 嗯,这很好奇:这是 r 告诉我的错误:Error in UseMethod("slice") : no applicable method for 'slice' applied to an object of class "c('grouped_df', 'tbl_df', 'tbl', 'data.frame')",知道它可能是什么吗?
        • 我明白了。我认为可能存在一些包冲突。您能明确提及包名称并尝试df %&gt;% dplyr::arrange(Val, Val2) %&gt;% dplyr::group_by(Reporter, Year) %&gt;% dplyr::slice(n()) 吗?
        【解决方案4】:

        使用data.table::setorder() 我试了一下你的问题。您可以使用管道并将其放入一行中。给出与 heds1 相同的结果,但如果您有一个大型数据集,将两者与基准进行比较是值得的。

        代码:

        dt1 <- data.table("Reporter" = c("USA", "USA", "USA", "USA", 
                                        "EU","EU", "EU","EU" ), 
                         "Year" = c(1970, 1970, 1980, 1990, 1970, 1980, 
                                    1980,1990), 
                         "Val1" = c(1,0,1,1,0,0,0,1),
                         "Val2" = c(0,0,0,1,0,1,0,1))
        
        dt2 <- setorder(dt1, -`Val1`, -`Val2`)
        dt3 <- unique(dt2, by = c("Reporter", "Year"))
        

        输出:

           Reporter Year Val1 Val2
        1:      USA 1990    1    1
        2:       EU 1990    1    1
        3:      USA 1970    1    0
        4:      USA 1980    1    0
        5:       EU 1980    0    1
        6:       EU 1970    0    0
        

        【讨论】:

          猜你喜欢
          • 2018-03-05
          • 2017-11-23
          • 1970-01-01
          • 2021-12-11
          • 1970-01-01
          • 2021-04-02
          • 1970-01-01
          • 2021-10-09
          • 2017-10-04
          相关资源
          最近更新 更多