You need to enable JavaScript to run this app. 如何用dplyr基于三列数据生成col1与col2的概率交互表
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 18:15:02