如何用dplyr基于三列数据生成col1与col2的概率交互表
R语言计算:生成col1与col2的fill=0交互概率矩阵
原始数据说明
现有R数据框结构如下:
df <- data.frame(col1=c(0,0,20,20),col2=c(12,20,12,20), fill=c(0,1,1,1)) # 数据预览 # col1 col2 fill # 1 0 12 0 # 2 0 20 1 # 3 20 12 1 # 4 20 20 1
需求说明
需要基于fill==0的条件生成col1和col2的交互概率矩阵,要求:
- 矩阵列为col1的唯一值,行为col2的唯一值
- 单元格值为对应col1、col2组合下fill取0的概率
预期输出示例:
0 20 12 0.50 0 20 0 0
现有问题
已实现的代码可以生成分fill值的概率表,但无法单独提取fill=0的目标子集,也没有dplyr的实现方案:
df %>% table() %>% prop.table(.,1)
上述代码输出结果:
, , fill = 0 col2 col1 12 20 0 0.5 0.0 20 0.0 0.0 , , fill = 1 col2 col1 12 20 0 0.0 0.5 20 0.5 0.5
解决方案
方案1:基础R直接提取子集
从已生成的三维表中提取fill=0的切片,转置调整行列顺序即可匹配预期输出:
res1 <- t(table(df) %>% prop.table(1) %>% .[,,"0"]) print(res1)
方案2:dplyr+tidyr实现(可读性更高、易调整逻辑)
library(dplyr) library(tidyr) res2 <- df %>% group_by(col1, col2) %>% # 计算每个col1+col2组合下fill=0的概率 summarise(prob_fill0 = mean(fill == 0), .groups = "drop") %>% # 转换为宽表,列对应col1取值、行对应col2取值 pivot_wider(names_from = col1, values_from = prob_fill0, values_fill = 0) %>% # 将col2设为行名,输出矩阵格式 column_to_rownames("col2") %>% as.matrix() print(res2)
两种方案的输出结果均和要求的预期一致。
内容的提问来源于stack exchange,提问作者LDT
相关产品推荐
相关产品推荐

