2016-08-01 9 views
1

У меня есть следующие следующего кадра данных («mydf»):Закрепление подобные (но не равные) строк и подсчета отличающуюся категориальной переменной в R

ID Type Count Mark 
U1  A  50  R1 
U1  A  50  R3 
U1  A  50  R4 
U1  A  50  R3 
U2  B  24  R2 
U2  B  24  R5 
U3  A  88  R1 

Каждая строка содержит 4 переменные:

  • ID: идентификатор пользователя.

  • Тип: тип пользователя, который категорическое и последовательно для всех строк с этим идентификатором.

  • Граф: подсчет пользователя, который является непрерывным и последовательно для всех строк с этим идентификатором.

  • Марк: один из 15 категорных символов, которые могут варьироваться между различными строк с одинаковым идентификатором.

В настоящее время существует одна строка для каждой марки, которая появляется, так что на каждый идентификатор имеется несколько строк.

Количество меток различно для разных идентификаторов (всего от 4 до 50).

Что необходимо сделать:

  1. Объединить строки с одинаковым идентификатором в одну строку, которая содержит всю последовательную информацию (тип/Count), а также перечисление (или количество) всех отметок, которые появляются для этого идентификатора. В этом листинге должно быть указано, как часто каждая метка появляется для этого идентификатора (например, если один и тот же знак отображается дважды для одного идентификатора, это необходимо отразить, как это происходит для U1 в строках 2 и 4).

  2. Получите подсчет количества раз, когда каждая метка появляется для каждого идентификатора.

  3. Получить общее количество меток для каждого ID.

Список меток для каждого идентификатора не требуется, если существуют подсчеты, описанные в 2 и 3 (см., Например, ожидаемый результат ниже).

Ожидаемый результат (приблизительно):

ID Type Count Mark_R1 Mark_R2 Mark_R3 Mark_R4 Mark_R5 Mark_Total 
U1  A  50  1  0  2  1  0  3 
U2  B  24  0  1  0  0  1  2 
U3  A  88  1  0  0  0  0  1 

Спасибо за вашу помощь!

+1

'библиотека (reshape2); dcast (mydf, ID + Type + Count ~ Mark, поля = "Mark") ' –

+0

@DavidArenburg: Это сработало отлично, спасибо. – Thredolsen

ответ

0

Мы можем использовать dplyr

library(dplyr) 
library(tidyr) 
mydf %>% 
    count(ID, Type, Count, Mark) %>% 
    spread(Mark, n, fill = 0) %>% 
    ungroup() %>% 
    mutate(Total = rowSums(.[grep("R\\d+", names(.))])) 
#  ID Type Count R1 R2 R3 R4 R5 Total 
# <chr> <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
#1 U1  A 50  1  0  2  1  0  4 
#2 U2  B 24  0  1  0  0  1  2 
#3 U3  A 88  1  0  0  0  0  1 
+0

Использование dplyr: df%>% group_by (ID, Тип, Счет, Марк)%>% summary (a = n())%>% spread (Mark, a, fill = 0) – PhilC

+0

Я протестировал это решение и он работает, поэтому я отметил его как выбранный ответ. Тем не менее, я рекомендую использовать решение, предложенное @DavidArenburg, которое требует меньше кода и дает более чистый результат: library (reshape2); dcast (mydf, ID + Type + Count ~ Mark, поля = "Mark") – Thredolsen

+0

@Thredolsen Вы правы, подход 'dcast' более краткий. – akrun