如何统计列表中各元素与其他元素的共现次数(R语言场景)
统计成员共现次数的解决方案
针对你提出的长格式数据统计成员共现次数的需求,这里用R的tidyverse工具链给出具体实现步骤:
1. 加载所需包
library(dplyr) library(tidyr)
2. 生成每个观测项内的成员两两组合
先对每个沙拉分组,生成组内食材的所有两两不重复组合:
pair_data <- df %>% group_by(salad) %>% group_modify(~ { # 只有当组内食材数≥2时才生成组合 if(nrow(.x) >= 2) { combn(.x$ingredients, 2, simplify = FALSE) %>% tibble(ingredient_pair = .) %>% unnest_wider(ingredient_pair, names_sep = "_") %>% rename(ingredient_A = ingredient_pair_1, ingredient_B = ingredient_pair_2) } else { tibble() } }) %>% ungroup()
3. 统计组合的共现次数
对生成的组合进行计数:
count_data <- pair_data %>% count(ingredient_A, ingredient_B, name = "count")
4. 生成全组合并填充0值
为了包含所有食材组合(包括从未共现的),先生成所有可能的两两不重复组合,再合并计数并将未共现的次数设为0:
# 获取所有食材的唯一列表 all_ingredients <- unique(df$ingredients) # 生成所有两两不重复组合(避免A-B和B-A重复) all_pairs <- expand_grid( ingredient_A = all_ingredients, ingredient_B = all_ingredients ) %>% filter(ingredient_A < ingredient_B) # 合并数据并填充0 results <- all_pairs %>% left_join(count_data, by = c("ingredient_A", "ingredient_B")) %>% replace_na(list(count = 0)) %>% arrange(ingredient_A, ingredient_B)
运行完上述代码后,results就是你需要的包含所有食材组合及共现次数的表格,其中未共现的组合次数会显示为0。
内容的提问来源于stack exchange,提问作者swr
相关产品推荐
相关产品推荐

