如何选择一列具有相同值但另一列具有不同值的所有行?

时间:2021-01-04 23:30:39

标签: r dataframe dplyr duplicates

我试图从我的 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 有两个不同的点号

2 个答案:

答案 0 :(得分:2)

我们可以对 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))

答案 1 :(得分:2)

使用 data.tableuniqueN 选项,按 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))