使用plyr汇总data.frame并获取每个唯一项的计数

时间:2013-05-23 14:27:44

标签: r grouping plyr run-length-encoding

我有一个带票务跟踪系统任务分配的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行,我想说“Alice 2,Bob 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 个答案:

答案 0 :(得分: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