Определите конфликты в строках, сгруппированных по уникальному идентификатору - PullRequest
0 голосов
/ 11 января 2020

У меня есть набор данных с несколькими дублированными строками, похожий на:

UniqueID = c(111, 111, 222, 222, 333, 333)
Color = c("Yellow", "Yellow", "Blue", "Blue", "Green", "Pink")
Height = c(11, 12, 22, 23, 33, 33)

df = data.frame(UniqueID, Color, Height)

Внутри группы строк с одним и тем же уникальным идентификатором Я бы хотел выделить любые конфликтующие данные (т.е. данные, которые не идентичны).

Например, в приведенной выше таблице есть три группы, которые определяются их уникальным идентификатором. 111,222 and 333.

В каждой группе я хотел бы выделить противоречивые данные. Например, в группе 111 я бы выделил, что высота отличается (11 против 12). В группе 222 я бы также выделил высоту. Однако в группе 333 я бы выделил цвет (зеленый против розового)

Мой план состоял в том, чтобы использовать library(DT) для окраски ячеек, чтобы я мог, по крайней мере, иметь визуальное представление о том, где возникают конфликты а затем начните оценивать, как их решить.

Конечный результат будет выглядеть примерно так:

enter image description here

До сих пор я использовал duplicated для удаления дубликатов в столбце но изо всех сил пытается решить, как подойти к этой проблеме. Единственный способ, о котором я могу подумать на данный момент, - это поместить все данные в отдельные df на основе уникального идентификатора, а затем выделить дубликаты внутри каждого df, но с 11 000 строк это кажется очень громоздким.

Точка в этом направлении будет очень признательна!

Ответы [ 2 ]

1 голос
/ 12 января 2020

Вы можете сделать это, сгруппировавшись по идентификатору и посчитав его появление следующим образом:

library(dplyr)

# Creating data
UniqueID = c(111, 111, 222, 222, 333, 333, 444)
Color = c("Yellow", "Yellow", "Blue", "Blue", "Green", "Pink", "Brown")
Height = c(11, 12, 22, 23, 33, 33, 40)

# Creating dataframe from data
df = data.frame(UniqueID, Color, Height)

df %>%
  # Grouping by ID
  mutate(similar_rows = row_number()) %>%
  group_by(UniqueID) %>%
  # If ID exist more than once then create new variable is_duplicated set by TRUE
  mutate(is_duplicate = ifelse(n() >= 2, TRUE, FALSE)) %>%
  # If you wanna highlight row numbers sharing same ID
  mutate(similar_rows = paste0(similar_rows, collapse = ",")) %>%
  ungroup()

# UniqueID Color  Height similar_rows is_duplicate
# <dbl> <fct>   <dbl> <chr>        <lgl>       
# 111 Yellow     11 1,2          TRUE        
# 111 Yellow     12 1,2          TRUE        
# 222 Blue       22 3,4          TRUE        
# 222 Blue       23 3,4          TRUE        
# 333 Green      33 5,6          TRUE        
# 333 Pink       33 5,6          TRUE        
# 444 Brown      40 7            FALSE    
0 голосов
/ 12 января 2020

Я не очень уверен насчет визуализации, но можно использовать group_by() и summarize(), чтобы получить обзор, и последующие манипуляции для поиска деталей, например,

tbl = tibble(UniqueID, Color, Height)
n <- tbl %>%
    group_by(UniqueID) %>%
    summarize(color = list(unique(Color)), height = list(unique(Height))

, давая

> n
# A tibble: 4 x 3
  UniqueID color     height
     <dbl> <list>    <list>
1      111 <chr [1]> <dbl [2]>
2      222 <chr [1]> <dbl [2]>
3      333 <chr [2]> <dbl [1]>
4      444 <chr [1]> <dbl [1]>

, который можно запросить, например,

> filter(n, lengths(color) >=2)
# A tibble: 1 x 3
  UniqueID color     height
     <dbl> <list>    <list>
1      333 <chr [2]> <dbl [1]>
> filter(n, lengths(color) >=2) %>% tidyr::unnest("color")
# A tibble: 2 x 3
  UniqueID color   height
     <dbl> <chr>   <list>
1      333 Green   <dbl [1]>
2      333 Pink    <dbl [1]>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...