[英]R: A way to filter based on values in another table?
我有两个具有以下结构的表。 表 1,我将其称为汇总表,是一个包含计数的类别值列表:
类别 | 价值 | 数数 |
---|---|---|
第一类 | VAL1 | |
第一类 | VAL2 | |
第一类 | VAL3 | |
类别 2 | VAL1 | |
类别 2 | VAL2 | |
三类 | VAL1 | |
三类 | VAL2 |
summary <- data.frame(Category = c('Cat1', 'Cat1', 'Cat1', 'Cat2', 'Cat2', 'Cat3', 'Cat3'),
Value = c('Val1', 'Val2', 'Val3', 'Val1', 'Val2', 'Val1', 'Val2'),
Count = c(NA,NA,NA,NA,NA,NA,NA))
我想用从表 2 收集的计数填充此表,我们将其称为原始数据表,它具有以下结构:
实体 | 第一类 | 类别 2 | 三类 |
---|---|---|---|
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', 'Val1', 'Val2', 'Val2', 'Val3', 'Val3', 'Val3'),
Cat2 = c('Val1', 'Val1', 'Val2', 'Val1', 'Val1', 'Val1', 'Val2'),
Cat3 = c('Val2', 'Val2', 'Val1', 'Val2', 'Val2', 'Val1', 'Val2'))
我想用每个类别和值对的适当计数填充汇总表中的“计数”列。 以编程方式,我想做的是通过原始数据表创建一个计数器 go 并更新每个值的计数。 我认为这在 R 中效率很低。 我想我会做的是过滤值,但是因为列名没有被评估为变量,所以我不知道如何做到这一点。
我尝试过的(我认为我想要的是):
library(dplyr)
summary$Count <- nrow(rawdata %>% filter(get(summary$Category) == get(summary$Value)))
但是,这行不通。 如何让过滤器从另一个表中获取值?
我们可以使用pivot_longer
重塑为“long”格式并使用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
,它将列的 rest 转换为 'long' 格式,列名称为由names_to
指定的“Category”,对应的值为“Value”( values_to
)
或使用带有table
的base R
subset(as.data.frame(table(data.frame(Category =
names(rawdata)[-1][col(rawdata[-1])],
Value = unlist(rawdata[-1])))), Freq > 0)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.