【问题标题】:R - Identify and remove duplicate rows based on two columnsR - 根据两列识别和删除重复行
【发布时间】:2021-09-11 18:06:00
【问题描述】:

我有一些看起来像这样的数据:

Course_ID   Text_ID
33          17
33          17
58          17
5           22
8           22
42          25
42          25
17          26
17          26
35          39
51          39

没有编程背景,我发现表达我的问题很棘手,但这里是:我只想保留Course_ID 不同但Text_ID 相同的行。因此,例如,最终数据将如下所示:

Course_ID   Text_ID
5           22
8           22
35          39
51          39

如您所见,Text_ID 22 和 39 是唯一具有不同 Course_ID 值的值。我怀疑对数据进行子集化是可行的方法,但正如我所说,我在这种事情上是个新手,非常感谢任何关于如何解决这个问题的建议。

【问题讨论】:

    标签: r duplicates subset unique


    【解决方案1】:

    选择没有Course_ID 重复的组。

    dplyr 你可以写成-

    library(dplyr)
    df %>% group_by(Text_ID) %>% filter(n_distinct(Course_ID) == n()) %>% ungroup
    
    #  Course_ID Text_ID
    #      <int>   <int>
    #1         5      22
    #2         8      22
    #3        35      39
    #4        51      39
    

    data.table -

    library(data.table)
    setDT(df)[, .SD[uniqueN(Course_ID) == .N], Text_ID]
    

    【讨论】:

      【解决方案2】:

      如果不是anyDuplicated,您可以使用ave 测试。

      x[ave(x$Course_ID, x$Text_ID, FUN=anyDuplicated)==0,]
      #   Course_ID Text_ID
      #4          5      22
      #5          8      22
      #10        35      39
      #11        51      39
      

      数据:

      x <- read.table(header=TRUE, text="Course_ID   Text_ID
      33          17
      33          17
      58          17
      5           22
      8           22
      42          25
      42          25
      17          26
      17          26
      35          39
      51          39")
      

      【讨论】:

        【解决方案3】:

        这是我使用rlistdplyr 的方法:

        library(dplyr)
        
        your_data %>%
          split(~ Text_ID) %>%
          rlist::list.filter(length(unique(Course_ID)) == length(Course_ID)) %>%
          bind_rows()
        

        返回:

        # A tibble: 4 x 2
          Course_ID Text_ID
              <dbl>   <dbl>
        1         5      22
        2         8      22
        3        35      39
        4        51      39
        
        # Data used:
        your_data <- structure(list(Course_ID = c(33, 33, 58, 5, 8, 42, 42, 17, 17, 35, 51), Text_ID = c(17, 17, 17, 22, 22, 25, 25, 26, 26, 39, 39)), row.names = c(NA, -11L), class = c("tbl_df", "tbl", "data.frame"))
        

        【讨论】:

        • 感谢您的建议。我确信这种方法有效,但我最终使用了其他建议之一。
        猜你喜欢
        • 1970-01-01
        • 2017-07-06
        • 2020-01-31
        • 2016-07-11
        • 2021-02-09
        • 2023-03-21
        • 2017-03-02
        • 2017-08-08
        • 2018-05-30
        相关资源
        最近更新 更多