R 带因子的数据帧复计数

R 带因子的数据帧复计数,r,shiny,R,Shiny,我有这张桌子 'data.frame': 5303 obs. of 9 variables: $ Metric.ID : num 7156 7220 7220 7220 7220 ... $ Metric.Name : Factor w/ 99 levels "Avoid accessing data by using the position and length",..: 51 59 59 $ Technical.Criterion: Fact

我有这张桌子

'data.frame':   5303 obs. of  9 variables:
 $ Metric.ID          : num  7156 7220 7220 7220 7220 ...
 $ Metric.Name        : Factor w/ 99 levels "Avoid accessing data by using the position and length",..: 51 59 59 
 $ Technical.Criterion: Factor w/ 25 levels "Architecture - Multi-Layers and Data Access",..: 4 9 9 9 9 9 9 9 9 9 ...
 $ RT.Snapshot.name   : Factor w/ 1 level "2017_RT12": 1 1 1 1 1 1 1 1 1 1 ...
 $ Violation.status   : Factor w/ 2 levels "Added","Deleted": 2 1 2 2 2 1 1 1 1 1 ...
 $ Critical.Y.N       : num  0 0 0 0 0 0 0 0 0 0 ...
 $ Grouping           : Factor w/ 29 levels "281","Bes",..: 27 6 6 6 6 7 7 7 7 7 ...
 $ Object.type        : Factor w/ 11 levels "Cobol Program",..: 8 7 7 7 7 7 7 7 7 7 ...
 $ Object.name        : Factor w/ 3771 levels "[S:\\SOURCES\\",..: 3771 3770 3769 3768 3767 3    
我想要一个这样的统计输出: 对于每个技术标准,都有一行,其中所有行的总和为临界.Y.N=0和1

因此,我必须将数据库中的行合并到一个新的矩阵中。使用因子和的值

但我不知道如何开始。。。?有什么提示吗


谢谢

我想你要求的是交叉列表。因为您没有提供可复制的样品,所以我使用了我的:

xtabs(~ Sub.Category + Category, retail)
制作:

如果希望值是基于销售额而不是计数,则可以将代码修改为:

xtabs(Sales ~ Sub.Category + Category, retail)
您将获得以下输出:

根据OP评论中的额外信息进行编辑 如果希望表也共享一个公共标题,并希望更改该标题的名称,则可以结合使用
names()
dimnames()
xtab
是一个交叉制表表,如果对其调用
dimnames()
,它将返回一个长度为2的列表,第一个对应于行,第二个对应于列

dimnames(xtab(dat))
$Technical.Criterion
[1] "TechnicalCrit1" "TechnicalCrit2" "TechnicalCrit3"

$`Object.type`
[1] "Object.type1" "Object.type2" "Object.type3"
因此,给定一个数据帧,
b

'data.frame':   3 obs. of  9 variables:
 $ Metric.ID          : int  101 102 103
 $ Metric.Name        : Factor w/ 3 levels "A","B","C": 1 2 3
 $ Technical.Criterion: Factor w/ 3 levels "TechnicalCrit1",..: 1 2 3
 $ RT.Snapshot.name   : Factor w/ 3 levels "A","B","C": 1 2 3
 $ Violation.status   : Factor w/ 2 levels "Added","Deleted": 1 2 1
 $ Critical.Y.N       : num  1 0 1
 $ Grouping           : Factor w/ 3 levels "A","B","C": 1 2 3
 $ Object.type        : Factor w/ 3 levels "Object.type1",..: 1 2 3
 $ Object.name        : Factor w/ 3 levels "A","B","C": 1 2 3
我们可以使用
xtab
,然后更改表格顶部的“common”标题。由于我不知道有多少级别处于
b$违例状态
,因此我将使用通用for循环:

for(i in 1:length(unique(b$Violation.status))){
  tab[[i]] <- xtabs(Critical.Y.N ~ Technical.Criterion + Object.type, b)
  names(dimnames(tab[[i]]))[2] <- paste("Violation.status", i)
}

我现在可以在我闪亮的应用程序中使用它

请用
dput
和预期输出显示一个小的可复制示例。请查看我的“最终表格样本”。它显示了计算总和的项目组合。我需要25行用于所有“技术标准”。每个“违例.状态”下的列有11个“Object.Type”。因此,我的第一个总和(17)是:计算我的数据帧的所有行,其中“技术标准”是第一行(“架构-多层…”),“违例.状态”是第一行(“添加”),而“对象类型”是第一行(“Cobol程序”)。最后,所有5303行都必须在该表中进行计算。问题是我有一个包含因子的数据库。我需要25行的所有“技术标准”。每个“违例.状态”下的列有11个“Object.Type”。因此,我的第一个总和(17)是:计算我的数据帧的所有行,其中“技术标准”是第一行(“架构-多层…”),“违例.状态”是第一行(“添加”),而“对象类型”是第一行(“Cobol程序”)。最后,所有5303行都必须在该表中计算。@Talcom扩展了我的答案以帮助您。谢谢您的提示。我是个新手,一切对我来说都是新的。我收到一个错误“找不到对象”选项卡。只有两个级别处于冲突状态。状态
                   Violation.status 1
Technical.Criterion Object.type1 Object.type2 Object.type3
     TechnicalCrit1            1            0            0
     TechnicalCrit2            0            0            0
     TechnicalCrit3            0            0            1