从看起来像矩阵的 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)
我的数据框如下所示:
'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
:
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)