2016-07-24 2 views
1

Я хотел бы объединить строки, удалить дубликаты, но сохранить uniques. Я могу сделать первые два, но не второй. У меня есть ф.р. названный предмет, который выглядит следующим образом:объединять дубликаты и сохранять уникальные элементы, используя dplyr :: distinct

unique_id subject  grade 
1   Math   88 
1   English  78 
1   History  98 
2   Math   65 
2   English  72 
2   History  84 

Этот код

combined <- distinct(subject, unique_id, .keep_all = TRUE) 

дает мне этот выход:

unique_id subject  grade 
1    Math   88 
2    Math   65 

я хотел бы, чтобы он выглядеть следующим образом:

unique_id subject      grade 
1    Math, English, History  88, 78, 98 
2    Math, English, History  65, 72, 84 

Решение ниже работает отлично! Вот еще одна морщина проблемы.

Если у меня есть набор данных, который выглядит следующим образом:

unique_id school subject grade sex 
    1  great Math  88  
    1  great English 78  
    1  great History 98 male 
    2  spring Math  65  
    2  spring English 72 female 
    2  spring History 84  

и запустить следующий код:

(r2 <- df %>% 
    group_by(unique_id) %>% 
    summarise_each(funs(toString(unique(.))))) 

я получаю следующий результат:

unique_id school subject      grade  sex 
    1  great Math, English, History  88,78,98  , male 
    2  spring English, English, History 65,72,84  , female 

Есть способ объединить пустые ячейки с запятыми в категории пола, так что это может выглядеть так:

unique_id school subject      grade  sex 
    1  great Math, English, History  88,78,98  male 
    2  spring English, English, History 65,72,84  female 

Спасибо!

ответ

2

Мы можем сделать это с помощью оклейки (toString является оболочкой для paste(., collapse=", ")) уникальные элементы вместе для каждого столбца после группировки по «unique_id»

library(dplyr) 
(r1 <- df %>% 
     group_by(unique_id) %>% 
     summarise_each(funs(toString(unique(.))))) 
# unique_id    subject  grade 
#  <int>     <chr>  <chr> 
#1   1 Math, English, History 88, 78, 98 
#2   2 Math, English, History 65, 72, 84 

Или мы можем держать его в качестве list, а затем извлечь list элементы

r2 <- df %>% 
     group_by(unique_id) %>% 
     summarise_each(funs(list(unique(.)))) 

с 'r2', мы можем unnest (от tidyr), если необходимо

library(tidyr) 
r2 %>% 
    unnest() 

Если мы используем путь Ор с distinct, мы можем удалить unique из summarise_each.

df %>% 
    distinct(subject, unique_id, .keep_all=TRUE) %>% 
    group_by(unique_id) %>% 
    summarise_each(funs(toString(.))) 
+0

спасибо, @akrun! Ваш первый вариант работает отлично. Один быстрый вопрос: я попробовал это с пустыми ячейками и заметил, что получаю какие-то запятые. Любые идеи о том, как добавить код, чтобы избежать подсчета пустых ячеек? См. Новый пример выше. СПАСИБО!!! – richiepop2

+0

@ richiepop2 Одним из вариантов было бы либо преобразовать его в NA, либо удалить его с помощью 'is.na' или иначе, мы можем сделать это с помощью sumise_each (funs (toString (. [Nzchar (.)])))' – akrun

+0

Я пробовал решение, которое вы предоставили, но оно, похоже, не работает. Я изо всех сил пытаюсь понять, как объединить строки, но пропустить пробелы. См. Новый пример кода выше. – richiepop2