首页 > 解决方案 > 如何检查一个数量未分配给其他字段的两个不同数量

问题描述

假设我有以下格式的数据(实际数据要大得多):

   CODE    NAME    DATE    HOUR
    1       Ab    1/1/19     1
    1       Ab    1/1/19     2
    1       Ab    1/1/19     3
    2       Xy    1/1/19     1
    2       Xy    1/1/19     2
    2       Xy    1/1/19     3
    3       Ab    1/1/19     1
    3       Ab    1/1/19     2
    3       Ab    1/1/19     3
    4       Pq    1/1/19     1
    4       Pq    1/1/19     2
    4       Pq    1/1/19     3

如何识别 NAME 字段中的任何值被分配给两个或多个值。像这里Ab分配给 CODE1以及3. 所需的输出如下:

    CODE    NAME    
     1       Ab
     3       Ab     

我确实尝试了以下操作,它给出了所需的输出:

    library(dplyr)
    df1 <- df %>% distict(CODE, NAME, .keep_all = TRUE)
    df2 <- df1[duplicated(df1$NAME),]    

我知道必须有更好的方法来做到这一点。如何实现。

标签: rduplicates

解决方案


一种方法是选择NAME超过 1 个唯一的位置CODE并保持不同的行。

library(dplyr)

df %>%
 group_by(NAME) %>%
 filter(n_distinct(CODE) > 1) %>%
 distinct(CODE, NAME)

#   CODE NAME 
#  <int> <fct>
#1     1 Ab   
#2     3 Ab   

数据

df <- structure(list(CODE = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 
4L, 4L), NAME = structure(c(1L, 1L, 1L, 3L, 3L, 3L, 1L, 1L, 1L, 
2L, 2L, 2L), .Label = c("Ab", "Pq", "Xy"), class = "factor"), 
DATE = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L), .Label = "1/1/19", class = "factor"), HOUR = c(1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L)), class = "data.frame", 
row.names = c(NA, -12L))

推荐阅读