问题描述
我有两个具有以下结构的表。表 1,我将称之为汇总表,是一个带有计数的类别值列表:
类别 | 价值 | 计数 |
---|---|---|
Cat1 | Val1 | |
Cat1 | Val2 | |
Cat1 | Val3 | |
Cat2 | Val1 | |
Cat2 | Val2 | |
Cat3 | Val1 | |
Cat3 | Val2 |
summary <- data.frame(Category = c('Cat1','Cat1','Cat2','Cat3','Cat3'),Value = c('Val1','Val2','Val3','Val1','Val2'),Count = c(NA,NA,NA))
我想用从表 2 中收集的计数填充此表,我们将其称为原始数据表,其结构如下:
实体 | Cat1 | Cat2 | Cat3 |
---|---|---|---|
Ent1 | Val1 | Val1 | Val2 |
Ent2 | Val1 | Val1 | Val2 |
Ent3 | Val2 | Val2 | Val1 |
Ent4 | Val2 | Val1 | Val2 |
Ent5 | Val3 | Val1 | Val2 |
Ent6 | Val3 | Val1 | Val1 |
Ent7 | Val3 | Val2 | Val2 |
rawdata <- data.frame(Entity = c('Ent1','Ent2','Ent3','Ent4','Ent5','Ent6','Ent7'),Cat1 = c('Val1','Val3'),Cat2 = c('Val1',Cat3 = c('Val2','Val2'))
我想用每个类别和值对的适当计数填充汇总表中的“计数”列。以编程方式,我想要做的是有一个计数器,通过原始数据表并更新每个值的计数。我认为这在 R 中效率非常低。我认为我要做的是过滤值,但由于列名没有被评估为变量,我不知道如何做到这一点。
我尝试过的(我认为我想要的是):
library(dplyr)
summary$Count <- nrow(rawdata %>% filter(get(summary$Category) == get(summary$Value)))
解决方法
我们可以使用 pivot_longer
将其重塑为“长”格式,并使用 count
来获取频率计数
library(dplyr)
library(tidyr)
rawdata %>%
pivot_longer(cols = -Entity,names_to = "Category",values_to = "Value") %>%
count(Category,Value)
-输出
# A tibble: 7 x 3
# Category Value n
# <chr> <chr> <int>
#1 Cat1 Val1 2
#2 Cat1 Val2 2
#3 Cat1 Val3 3
#4 Cat2 Val1 5
#5 Cat2 Val2 2
#6 Cat3 Val1 2
#7 Cat3 Val2 5
注意:pivot_longer
将数据从“宽”格式重塑为“长”格式。通过指定 cols = -Entity
,它将其余列转换为“长”格式,列名称为 names_to
指定的“类别”,相应的值为“值”({{1} })
或者将 values_to
与 base R
一起使用
table