Используйте plyr для суммирования data.frame и получения количества каждого уникального элемента

У меня есть data.frame с назначениями задач из системы отслеживания билетов.

Assignments <- data.frame('Task'=c(1, 1, 2, 3, 2, 2, 1), 'Assignee'=c('Alice', 'Bob', 'Alice', 'Alice', 'Bob', 'Chuck', 'Alice'))

Мне нужно обобщить данные для некоторых ежемесячных отчетов. Вот что у меня так далеко:

ddply(Assignments, 'Task', 
      summarize, 
      Assignee.Count=length(Assignee), 
      Unique.Assignees.Involved=length(unique(Assignee)),
      Assignees.Involved=paste(Assignee, sep=", ", collapse=", "))

И это мне сети:

  Task Assignee.Count Unique.Assignees.Involved Assignees.Involved
1    1              3                         2  Alice, Bob, Alice
2    2              3                         3  Alice, Bob, Chuck
3    3              1                         1              Alice

В столбце Assignees.Involved я хотел бы обобщить данные. В строке 1 я хотел бы сказать: "Алиса 2, Боб 1". Мне кажется, что мне нужно использовать какой-то другой plyr метод, чтобы взять Assignees для каждой задачи, сортировать их, а затем запустить их через rle функции, и вставьте длины и значения обратно вместе. Я не могу понять, как это сделать в функции суммирования.

Вот результат для всего data.frame:

paste(rle(as.vector(sort(Assignments$Assignee)))$values,
      rle(as.vector(sort(Assignments$Assignee)))$lengths,
      sep=" ", collapse=", ")

Результаты:

[1] "Alice 4, Bob 2, Chuck 1"

1 ответ

Решение

Я понял это при публикации вопроса:)

Хитрость заключается в том, что внутри функций, указанных в качестве аргументов summarize функция, вы называете их голым словом; Assignments$Assignee должен называться просто Assignee, без фрейма данных, без кавычек и т. д.

Итак, однажды я понял, что rle функция могла привести меня туда, где я должен был быть, у меня было то, что мне нужно.

ddply(Assignments, 'Task', 
      summarize, 
      Assignee.Count=length(Assignee), 
      Unique.Assignees.Involved=length(unique(Assignee)), 
      Assignments=paste(rle(as.vector(sort(Assignee)))$values, 
                        rle(as.vector(sort(Assignee)))$lengths, 
                        sep=" ", collapse=", "))

дает:

  Task Assignee.Count Unique.Assignees.Involved             Assignments
1    1              3                         2          Alice 2, Bob 1
2    2              3                         3 Alice 1, Bob 1, Chuck 1
3    3              1                         1                 Alice 1
Другие вопросы по тегам