Сравнение появления данных в двух группах

У меня есть данные с именем пользователя и группой.

User_Name    Group
MustafE       A
fischeta      A
LosperS1      A
MustafE       B    
fischeta      B  
jose          B  
MustafE       c   
fischeta      c 

Я хочу пометить тех клиентов, которые не являются повторяющимися группами. Пример: «LosperS1» находится в группе A, но не в группе B, точно так же, как «jose» находится в группе B, но не в группе C, поэтому в новом столбце они будут быть помечены как «Нет в группе B/Нет в группе C»

Любая помощь будет оценена.


person Sumaiya Khatun    schedule 29.06.2018    source источник
comment
Попробуйте df1 %>% distinct(User_Name) %>% pull(User_Name) %>% map_df(~ df1 %>% filter(User_Name == .x) %>% mutate(Flag = toString(setdiff(unique(df1$Group), unique(Group)))) %>% slice(1) %>% select(-Group)) %>% right_join(df1, "User_Name")   -  person akrun    schedule 29.06.2018
comment
Потрясающе .... Именно то, что я хотел .. Большое спасибо   -  person Sumaiya Khatun    schedule 01.07.2018


Ответы (1)


Вот способ получить вывод, используя tidyverse. Получите distinct элементов столбца «Имя_пользователя», выполните цикл по этим элементам (map), filter строки набора данных на основе наличия зацикленных элементов в «Имя_пользователя», paste элементы, которые не найдены в столбце «Группа», когда по сравнению с отфильтрованной «Группой», подмножить первую строку (slice) и right_join с исходным набором данных. Мы использовали map_df, чтобы получить конечный результат в виде одного data.frame вместо list из data.frame.

library(tidyverse)
df1 %>% 
   distinct(User_Name) %>% 
   pull(User_Name) %>% 
   map_df(~ df1 %>%
              filter(User_Name == .x) %>%
              mutate(Flag = toString(setdiff(unique(df1$Group), 
                                             unique(Group)))) %>% 
              slice(1) %>%
              select(-Group)) %>% 
              right_join(df1, "User_Name")
person akrun    schedule 01.07.2018