You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按共享ID分组,统计满足cls_code=1的value列值组合频率

基于ID和cls_code的value组合频率统计

原始数据

df <- data.frame(id = c(1,1,1,2,2,3,3,3,4,4),
                 value = c('a','b','c','a','b','d','b','c','c','a'),
                 cls_code = c(1,1,0,1,1,0,1,0,0,1))

需求说明

统计每个id下,满足以下条件的组合频率:

  • 行值仅关注cls_code=1的value中的a和b;
  • 列值为所有出现过的value(a/b/c/d);
  • 仅当行值和列值属于同一个id时统计,每个id仅计数一次(无论对应值出现多少次)。

解决方案

使用dplyr、tidyr和purrr包实现,步骤如下:

  1. 加载所需包
library(dplyr)
library(tidyr)
library(purrr)
  1. 提取每个id的关键数据集合
# 提取每个id下cls_code=1且value为a/b的唯一值
id_cls1_ab <- df %>%
  filter(cls_code == 1, value %in% c("a", "b")) %>%
  group_by(id) %>%
  summarise(x_values = unique(value)) %>%
  ungroup()

# 提取每个id下所有出现过的唯一value
id_all_values <- df %>%
  group_by(id) %>%
  summarise(y_values = unique(value)) %>%
  ungroup()
  1. 生成id对应的x-y组合并统计次数
# 连接两个数据集,展开每个id的x-y组合
id_combos <- id_cls1_ab %>%
  inner_join(id_all_values, by = "id") %>%
  mutate(combo = purrr::map2(x_values, y_values, ~ expand.grid(x = ., y = ., stringsAsFactors = FALSE))) %>%
  unnest(combo)

# 统计每个(x,y)组合对应的id数量,整理为宽表
result <- id_combos %>%
  count(x, y) %>%
  pivot_wider(names_from = y, values_from = n, values_fill = 0) %>%
  arrange(x)

# 补全所有可能的列,确保a/b/c/d都存在
all_y_values <- unique(df$value)
result <- result %>%
  mutate(across(setdiff(all_y_values, colnames(.)), ~ 0)) %>%
  select(x, all_y_values)
  1. 输出结果

数据框形式

print(result)
# 输出:
#   x a b c d
# 1 a 3 2 2 0
# 2 b 2 3 2 1

矩阵形式(更接近示例格式)

result_matrix <- as.matrix(result[, -1])
rownames(result_matrix) <- result$x
print(result_matrix)
# 输出:
#   a b c d
# a 3 2 2 0
# b 2 3 2 1

内容的提问来源于stack exchange,提问作者CT3800

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:52:52