Используйте 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