按共享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包实现,步骤如下:
- 加载所需包
library(dplyr) library(tidyr) library(purrr)
- 提取每个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()
- 生成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)
- 输出结果
数据框形式
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
相关产品推荐
相关产品推荐

