从看起来像矩阵的 table 中获取列名和频率

Get column names and frequency from a table that looks like a matrix

我的数据框如下所示:

'Part Number' 'Person Working'
'A'           'James'
'B'           'Brian'
'A'           'Andrea'
'C'           'Tiffany'

依此类推数千行。同一部分可以分配给多个人。我很不擅长总结 R 中的数据,但我能够(在控制台中)通过键入以下内容生成看起来像频率矩阵的 table:

table(df$partnumber, df$personworking)

它会吐出独特的项目作为行,每个工作人员的名字作为列。值是 0 或 1,具体取决于它们是否在该部分工作。

我正在寻找的是一种以易于理解的格式总结此信息的方法,即每项:

Part Number   NumWorkers    Names
A             3             "James, Andrea"
B             1             "Brian"
C             1             "Tiffany"

我也在努力将我的 table 放入数据框中。我试过:

thedataframe <- data.frame(thetable[,])

但我还没有走多远。我想总结每个独特部分的工作人员数量,并连接并打印每个列名,其中每个列名都有一个作为给定部分的值。

在 Base R 中汇总此数据的最佳方法是什么?

我们可以使用data.table。将 'data.frame' 转换为 'data.table' (setDT(df)),按 'partnumber' 分组,得到行数 (.N) 和 paste 'personworking' 在每个 'partnumber'.

library(data.table)
setDT(df)[,.(NumWorkers = .N, Names = toString(personworking)) , by = partnumber]

或者我们可以使用 dplyr

library(dplyr)
df %>%
   group_by(partnumber) %>%
   summarise(NumWorkers = n(), Names = toString(personworking))   

或使用base R

do.call(rbind, by(df, df$partnumber, FUN = function(x) 
   data.frame(NumWorkers = length(x$personworking), Names = toString(x$personworking))))

这是一种可以在 aggregate:

基础 R 中使用的方法
dfAgg <- do.call(data.frame,
           aggregate(df$Person, list(df$Parts),
                     FUN=function(x) c(length(x), paste(x, collapse=", "))))
# add nicer names
names(dfAgg) <- c("Parts", "Count", "Person")

聚合允许您 运行 一个函数在组上。在这种情况下,我们正在 运行ning 一个函数,该函数 returns 个人的数量(通过 length)和他们的名字(通过 paste)。

这是我用来测试的示例数据。

数据

set.seed(1234)
df <- data.frame("Parts"=sample(LETTERS[1:3], 10, replace=T),
                  "Person"=sample(c("James", "Brian", "Sam", "Tiff", "Sandy"), 
                                  10, replace=T), stringsAsFactors=F)