【问题标题】:How do I select all rows where one column has the same value but another column has a different values? [duplicate]如何选择一列具有相同值但另一列具有不同值的所有行? [复制]
【发布时间】:2021-01-04 23:30:39
【问题描述】:

我正在尝试从我的 R 数据框中提取 ID 列具有相同值而 pt 列具有不同值的行。 例如,如果我的数据框如下所示:

ID    pt
600   DC90
600   DC90
612   DC18
612   DC02
612   DC02
630   DC30
645   DC16
645   DC16
645   DC16

我想要的输出如下所示:

ID    pt
612   DC18
612   DC02
612   DC02

因为 ID 612 有两个不同的 pt 编号

【问题讨论】:

    标签: r dataframe dplyr duplicates


    【解决方案1】:

    我们可以对 ID 和 filter ID 进行分组,其中 'pt' 中不同元素的数量大于 1

    library(dplyr)
    df1 %>%
        group_by(ID) %>%
        filter(n_distinct(pt) > 1)
    

    -输出

    # A tibble: 3 x 2
    # Groups:   ID [1]
    #     ID pt   
    #  <int> <chr>
    #1   612 DC18 
    #2   612 DC02 
    #3   612 DC02 
    

    如果是检查所有元素应该不同

    df1 %>%
        group_by(ID) %>%
        filter(n_distinct(pt) == n())
    

    数据

    df1 <- structure(list(ID = c(600L, 600L, 612L, 612L, 612L, 630L, 645L, 
    645L, 645L), pt = c("DC90", "DC90", "DC18", "DC02", "DC02", "DC30", 
    "DC16", "DC16", "DC16")), class = "data.frame", row.names = c(NA, 
    -9L))
    

    【讨论】:

      【解决方案2】:

      使用uniqueN 的data.table 选项,按ID 分组

      > setDT(df)[, .SD[uniqueN(pt) > 1], ID]
          ID   pt
      1: 612 DC18
      2: 612 DC02
      3: 612 DC02
      

      数据

      > dput(df)
      structure(list(ID = c(600L, 600L, 612L, 612L, 612L, 630L, 645L,
      645L, 645L), pt = c("DC90", "DC90", "DC18", "DC02", "DC02", "DC30",
      "DC16", "DC16", "DC16")), class = "data.frame", row.names = c(NA,
      -9L))
      

      【讨论】:

        猜你喜欢
        • 2017-02-14
        • 2019-05-31
        • 2012-05-25
        • 2015-07-17
        • 2017-12-24
        • 2022-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多